A puzzle game where each level tells a story about the transformations caused by life and death. Is this really all the text that can fit on a page.
The majority of the programming on Changes was done by me, with some help from Heather Zeis at the beginning and middle of the project. She implemented the animation system and did early experiments with rendering styles.
The movement was implemented using a transaction system to verify that a move could successfully be completed. Each move transaction was stored as a diff so that the player has full undo.
Rendering is done by taking a tesselated quad and offsetting the verts. The cell data (such as height and position) is passed to the shader with a buffer object. We use the vert index to lookup which cells effect that vertex and offset it accordingly.
To minimize loading times all assets are loaded into different memory arenas based on their lifetimes. This makes it trivial to unload assets. We avoid frame hitches when loading by making sure to load the assets in the background in a separate arena so we can simply swap between the active data. GPU resources are also allocated up front and updated as next textures come in.
One feature I'm very proud of is the dynamic audio system where music is created entirely from in-game events. Each turn of the game we play sounds for all the events that happen in the game (cell birth, death, player movement, etc). We use a "liszp" file to specify which sounds play for each event on a given turn. We can choose to play a random note from a pool, or play things in a sequence to create an interesting wind-chime effect where the sounds of your last move echo as you consider your next action.