

Heartwrench Advance is a love-letter to my favorite childhood games on the Game Boy Advance and an exercise in systems programming, technical art and gameplay design. This project is my largest solo-dev undertaking to date, in which I designed all gameplay, wrote all game systems and created all art assets from scratch while working under the tight constraints of the Game Boy Advance’s memory and processor.
The Systems
The systems I wrote for Heartwrench Advance span over 25,000 lines of original C++ code and include:
-Physics simulation that supports moving objects a precise amount of pixels per frame, or applying “force” vectors that decay at a requested rate.
-Indexed, tile based map collision and object collision using axis-aligned bounding boxes.
-A GameObject class hierarchy.
-State machines for managing the behaviors of over 25 unique GameObject child classes.
-A Level -> Room -> Object management hierarchy.
-A dynamic camera that leads the player’s movement direction and smoothly transitions between rooms.
-Dynamic object loading and unloading based on current room and camera distance from an indexed tile spawn position.
-Object persistence.
-Health and currency resource systems.
-Game juice such as hit-stop frames, sprite and background flash frames by palette manipulation, screen- shake, and sprite squash and stretch.
Read the source code here.
The Art
The visual workflow for Heartwrench was as follows:
-All game objects were first drafted in Krita, as a cartoonist might, with an emphasis on silhouette. Silhouettes were designed with an eye for appealing shapes and proportions that would remain readable on the Game Boy Advance’s miniscule screen.
-Once settled on a silhouette and a loose concept, I moved into Aseprite to translate the designs to a limited pixel art resolution. The majority of objects were drafted on a 32×32 pixel canvas.
-While the Game Boy Advance supports color palettes of up to 256 distinct colors, I leaned into the limitations to create objects and environments that felt minimal and cohesive. Opting for a 16-color palette kept the art readable, gave the impression of a clear artistic vision, and made less work for me.
-Using a triadic color scheme, I settled on 3 primary “global” colors that would transcend the game. These colors (red, yellow and blue) were used for the player character and associated with the game objects that appear in all levels.
-For local level objects and backgrounds, I used a separate triadic scheme of yellow, purple and green. The global and local color palettes do not clash when sharing a scene because the rules of saturation, hue and value shifts are shared by all of the light and shadow color ramps.
-I limited all sprite animations to almost exclusively key-frames. This captured the action of each animation without overwhelming the Game Boy Advance’s processor, or the animator, with tween frames.
-I utilized the same color palette as sprite objects for the painted backgrounds, but reduced the saturation of all background colors to prevent them from clashing with the foreground, where I wanted the player’s focus to be.
-The final images were exported from Aseprite as .bmp files, then imported into the project using JSON.
See the art in action here.
The Gameplay
I began development on Heartwrench Advance knowing that gameplay would proceed as a combat/platforming hybrid based on popular titles like Mega Man and Shovel Knight. The following goals lead my gameplay design decisions:
-To design core player verbs that provide utility to the player, interact with the game world in a variety of ways, and feel fun to perform.
-To introduce level mechanics fairly, then build on them by carefully increasing the challenge of successive platforming and combat scenarios.
-To design level mechanics that have gameplay implications in both combat and platforming, contributing to mechanical depth.
-To give in-game “coin-like” currency immediate value when collected within a level, without relying on an archaic lives system.
-To present the player with meaningful choices based in risk and reward.
Read my living document on game design here.