ROLE: PROGRAMMER
ROLE: PROGRAMMER
TEAM SIZE: 5
DURATION: SEPTEMBER 2024 - APRIL 2025
Dr. SilverBall is an arcadey, 2D pinball game created using a custom engine in C++ that our team built from the ground up. In this project I implemented our audio system using FMOD, built an editor using ImGui, co-created real-time scene management, and programmed behaviors for core gameplay features. This was a challenging task to complete on a team of only five programmers, but it taught me a lot about engine architecture and what goes into developing a game alongside the tech that supports it.
The editor was created during the second half of the project, and was crucial for seeing changes to our scenes/entities in realtime. It also allowed us to modify, save, and load scenes and entities. The three basic sections I created for the editor were the graphics, sound, and scenes tabs.
The graphics section had a full screen toggle, debug draw toggle, background setter, and the ability to edit the camera’s translation, rotation, and zoom. The sound section contained sliders for the master, music, and sound effect volumes. The scenes section had two sub sections, the scene selector, and the data for the current scene. The scene selector allowed for scene switching, as well as the ability to add, delete, and copy scenes in real time. The current scene contained a list of entities in the scene, and selecting one would bring up that entity’s data. Much like scenes, entities had the ability to be selected, created, copied, and deleted. Once an entity was selected, each of its components could be edited, deleted, and re-added. By enabling the team to work on the game through an editor, iteration on gameplay became much quicker.
On this project I oversaw the main branch of the repository and was in charge of making sure it was never compromised. This meant never allowing any direct commits to main. Instead, I had the team work on their own feature branches, update from main frequently, and submit a pull request for someone on the team to review. I personally reviewed 42% of all pull requests, which resulted in significantly less broken builds on main than in my previous projects. Our goal was to make sure that the main branch was always functioning and could be shown off at any moment.
While less time was spent on gameplay programming during this project, I’m still proud of the work I was able to accomplish here. For this project I implemented the final objective, a locked up hourglass that had to be destroyed so the player could win. As this was the finale to the game, I knew it needed to have a large spectacle and feel rewarding to the player. For this portion of the game I collaborated with an artist to make all of the art assets for this feature.
Initially, there was a big hourglass in the center of the screen that could only be destroyed once all of the prior objectives had been completed. Playtests proved that this approach was ineffective, because it was unclear why the hourglass was unbreakable one moment, and then became the most important objective to break in the next. I solved this by putting a comically large lock onto the hourglass. Immediately this had the intended effect of players realizing the hourglass was important, and wanting to find a way to unlock it. Once it was unlocked, players could continue to hit the hourglass until it broke. To sell this effect, I had the hourglass switch between different cracked states, based on what percentage of its health was left.
The final touches on the hourglass are what made it all come together. I implemented all the vfx that appeared when hitting the hourglass, as well as the sound effects that played when it hit, cracked, and destroyed. I wanted a large, movement heavy effect to occur when the hourglass was destroyed, but we had no animation system in our engine to make this happen. As a work around, I had the hourglass move toward the bottom of the screen, and then bounce up to the top offscreen, all while spinning and being followed by a particle trail. This gameplay mechanic was effective in wrapping up the experience for our players.