Polypore is a sci-fi grand strategy game I am actively developing as the lead game programmer of Broken Bag Games. The player has crash-landed on a mushroom-covered alien planet and must harvest resources, expand their territory, and combat the natives to acquire the material needed to escape.
Created from scratch the hex generation and grid movement, building and resource management, fog of war, and combat systems in Unreal Engine 5 with C++ code.
Deeply collaborated with the team’s programmers and designers to ensure needed systems and data were easily accessible and modifiable in C++ and Blueprint.
Strongly maintained the organization and readability of code to allow for clean and simple expansion of game systems in the future.
As the senior capstone project for the six George Mason University students that made up Broken Bag Games, Polypore was conceived with the intention of being the pinnacle of what we could create from our four years of experience in the game design program. From a game programming standpoint, my goal was to demonstrate my self-teaching ability, dedication to writing efficient, designer-friendly code, and management of scalability and cleanliness in a project with the level of complexity found in similar grand strategy games. With these goals in mind, I agreed with the team's pitch to develop Polypore using the Unreal Engine and C++, which we all had little experience using as GMU's programming classes were very oriented around Unity/C#. This would certainly be an ambitious undertaking, but if successful, would make for an amazing portfolio piece.
When tackling the process of learning Unreal, I knew that, when mastering any tool or subject, I was at my best when applying the learned material to a case study project to get into the flow of using it, so that's exactly what I did in the months leading up to the senior semesters. After following some tutorials, I immediately set to creating some projects in Unreal, starting with a weekend game jam where the Polypore team attempted an isometric stealth game in the vein of Metal Gear. We didn't get very far as we were still very new to the engine, but I did gain some valuable experience creating top-down camera controls and gameplay elements that used the mouse cursor's position in 3D space.
My next project greatly explored Unreal's physics system as I endeavored to recreate the momentum-based movement found in 2D Sonic the Hedgehog games. Creating my own character movement class, I incorporated Unreal's physics body and line trace functionality in implementing such features as rotating the character relative to inclines, snapping the character to the ground when running at certain speeds, and trimming relative 'up' and 'down' velocities while snapped to preserve momentum when running up and down hills, bringing my project quite close to the iconic Sonic feel. The trial and error I experienced during these test projects were vital in building my momentum with Unreal so I could hit the ground running with Polypore that Fall.
Undoubtedly the feature of Polypore with the most depth is the assembly and utilization of the building system, as functionally it touches almost every corner of the project. From resource management to hex interaction to troops, battles, fog of war, and user interface, buildings are a part of it all, and it's interesting to see just how it does so from a technical standpoint.
Merely the action of constructing a building is in itself fascinating. The first step was to select a hex to build upon, which required an object selection system to be in place. This was where my aforementioned experience with utilizing the cursor's 3D position came in handy, and once I had a "hex selection mode" assembled, I could advance to generating the list of buildings to construct in the heads-up display, which prompted me to develop an intimate familiarity with Unreal's UI system and crafting a communication link between C++ and Blueprint code. In this case, I had to craft a building selection menu in Blueprint that pulled each option's name, icon, and resource cost from C++ code and, if clicked, would call a C++ method to purchase and construct the represented building. The construction method itself then had to be written, checking the player faction for sufficient funds and the hex for free space to build before extracting those funds, spawning the building object, assigning it to its hex and faction, and initiating the building's construction process.
The variety of building-specific actions added to this depth. Resource-gathering buildings like the farm, mine, and power plant simply amplified the quantity of resources harvested by workers on a tile, while buildings like the outpost claimed hexes for its faction to utilize, the troop factory allowed troop types to be constructed in similar fashion to buildings, troop storage gave troops a place to heal idly without consuming faction resources, and defense stations buffed the combative abilities of buildings and troops in its radius.
Buildings also interacted with the troop-oriented battle system, where enemy troops could initiate sieges when stepping onto building-occupied tiles. The sheer number of individual systems that I crafted in and around buildings alone is staggering, and their ability to function together, especially as more systems are added to the project, is a testament to the modularity and scalability of Polypore's framework.
During my time working on Polypore, I created systems for procedural generation of the world grid and navigation along it, in-game economy, the purchasing and constructing of troops and buildings, fog of war, army management mechanics like merging, splitting, and calculating battle damage based on army composition, and much more. The game is still very much a work in progress, and with that are many more features and learning opportunities to create and experience. The behavior of alien factions in the world, for example, can be greatly expanded, and I have already crafted the base architecture for a behavior system that organically constructs buildings, commands troops, and expands territory based on available resources, income, and occupied hexes.
I've become a huge fan of the Utility AI decision-making framework after successfully implementing it in a third-person shooter case study, so I decided to use it as Polypore's AI framework as well. With the complexity and quantity of actions and considerations present in existing grand strategy AI, in addition to the numerous logic and number tweaks that will inevitably be done on the designer side, I believe a modular action/consideration scoring system present in Utility AI would be perfect for Polypore, though I definitely will have to break down faction behavior into multiple topic-specific controllers so setting a troop destination does not have to compete with constructing a farm, for example. Exploring exciting and new features like this allow Polypore to continue being an incredibly fun project to work on, and I cannot wait to see how I develop with it.