BTB Postmortem

POSTMORTEM

While work on BTB is going to continue into the future(minor optimization fixes, some additional content using preexisting assets, bugfixes and the like) a majority of the work is finished, as we have mostly all graduated. The Goal is to get this up on Steam within 5 weeks of graduating (Written 6/8/2023, check out Steam if it's past July of 2023!). While work will still continue for these 5 weeks I wanted to take the time and write a postmortem on the past 20 weeks of development to share what I learned, both skills wise and management wise, as well as communicate where the project succeeded and where it could be improved and tightened up. After the game is published on Steam I'll most likely come back and write a Post Script to this if any major changes happen, so stay tuned!

Before going into more detail, I want to convey how wonderful of an experience this was. I was able to lean and utilize SCRUM and Agile to great effect. Additionally the feeling of seeing your designs come to life and being able to directly collaborate with others to bring your ideas to life is a beautiful thing. I feel as though I also got a really good glimpse into AAA workflows, as by the end our team was over 70 people! While many studios have plenty more, I think it was a fantastic insight into the various benefits and shortcomings of large teams, and it gave me valuable experience working within and directing parts of large teams.

Preproduction began a long time ago (or at least it feels like it) in November of 2022, most of this was ideation on our core design. Origonally, as many good game ideas are, the concept came from soem of us watching a movie and commenting how there's not a lot of pure samurai western fusion. While the game evolved a great deal from there, I still hold some pride in knowing that I shaped the game into being a Western. Over the Winter break we all went into our own little corners to iron out specific details. Narrative was written for the story, core systems were ironed out, and I began work on the Illustrious 23 page design document. 

Design has always been my favorite part of the process, as it really allows me to flex my creativity, while still working within the frameworks of what's been given to me. I'm a firm believer that constraints cause creativity, so, as I was on vacation, being able to communicate with our narrative lead, character artists, and other members of of the team as to what I wanted to make, what we were able to do, and what fit the world was an incredible exercise. Needless to say, with most Development cycles no design survives first contact with the Programming team, however as a programmer myself, I'm quite happy with what we were able to accomplish, and the unique abilities we were able to maintain from the design phase. The Design document remained a living document throughout the course of development, but many of the core designs remained intact, and if they were changed, I was the one to hold final say on what needed to be rearranged, except for the cut toxic toad design, by Phil Echavarria.

Development Commenced officially at the beginning of Winter Quarter at SCAD, starting our first 10 weeks of development. We, luckily, hit the ground running, immediately starting work on the first (and my personal favorite) of the designs, the Wolf. Early on, before we knew any better, I was under the impression that the wolf would 1. work best if purely hard coded, no behavior trees necessary and 2. it would be a good idea for multiple people to work on the same piece of code. Hubris does not begin to describe my ideals. Quickly it turned out that neither of these were feasible, as the code became too unwieldy for one designer to understand, and, unfortunately, multiple designers on one enemy, broke our original wolf. While it might have been possible to rework the code and keep it alive in it's jank state, we made the executive decision to rebuild it from the ground up. Fortunately much of the code we still wrote was good, and could be parsed and chunked out into Behavior Tree nodes, so over the course of a single weekend, I refactored our old code into a much easier to understand Behavior Tree. Additionally I laid the framework for enemy programming going forward, having a universal Blackboard that all enemy BT's could reference and instating the One Programmer rule. 

From there, our tasks were divvied up and work began on the second of 3* enemies to be finished this Quarter. I continued to refine the wolf, as their main draw, the pack tactics, had to be completely reworked in the context of BT's. The other AI programmer on the team took up the task of beginning work on the Scorpion. On my end of things, the Pack Tactics proved to be quite the interesting conundrum. While it wasn't exceptionally difficult to get the AI to flank the player (just 2 simple target points on the player's asset) the scattering was the difficult part. The goal behind the Scattering was the break up the monotony of a bunch of wolves standing in a circle, tearing you to pieces, and instead try and mimic real wolf hunting behavior. Wolves will slowly surround it's prey, making attacks from the side or inopportune positions to wear it down, while the rest of the wolves keep a loose perimeter. Our Wolves, by design, would all close in to attack at once, then split away, this seemed a touch stilted, as well as opening ourselves up for some interesting bugs in the code. 

To Get the wolves to Scatter, we ran a series of checks in a doughnut around the wolves, ensuring their scatter location was far enough away that it was noticeable, but not too far. This was an elegant solution, but the way we checked for valid locations led to a lot of Infinite Loops. I worked on this issue for a great deal of time but to no avail. The wolves worked well enough as is without random scattering, and the constant motion of the player would often counteract the most egregious instances of them standing still. It wasn't until much later, when we were refining the implementations that our lead programmer and I learned about Environmental Query Systems, This handily solved our problems, and led us to shift the implementation of the Scatter. since the wolves already worked well without it, we added it as a damage function. This encouraged players to spread their damage between wolves, stagger pressure, and offer additionally encouragement and feedback to players. 

Throughout the course of working on the wolf, I was also able to work extensively with out Animation, Character, And Sound teams to fully bring the wolf into the world. The incredible model was done by Grace Bowman and it's final animations were done by Luke DeSimone. Animation, early on, however was a bit difficult. As with many sections of large teams people over promise and vastly underdeliver. When the wolf model was complete it began the process of being rigged in unreal. What we ended up getting was an incredibly unwieldy rig which broke after every animation was baked about 2 weeks past it's deadline. We worked with it as well as we could, and were able to get the broad strokes of the wolfs animations complete in time for the end of Winter Quarter, but it was clear we would need to revamp them at a later date. 

Meanwhile development of the Scorpion was well underway. While I did a majority of the Animation implementation and design, the programming was all done by John LaRochelle, my AI partner in crime. There were many interesting challenges to be had in the programming side of things, from ensuring the Scorpion remained on solid ground to preventing it's charge from launching you across the room, but overall I was quite impressed with how well my design was brought to fruition by John. A great deal of communication was had between myself, John, and the Animation team to make sure the Scorpion really shone as a powerful tank. 

It was quite an interesting task assisting programmers in coding my designs, as up to this point I worked mainly as a Solo dev, especially when working with AI. I found that keeping the Design Doc up to date and easily accessible, as well as frequent, open communication and feedback was incredibly valuable to ensuring the success of the implementation. John was excellent about asking me questions and clarifications, and I often gave feedback on the state of the enemy, which was implemented effectively (after a brief justification for it's inclusion of course). I'm really very proud of how the Scorpion turned out in the end, as it certainly had it's own fair share of issues on the bug side, especially with pathfinding, but John was able to pull through and create an incredible AI that fit perfectly into my design specifications.

While working on the wolf, we also began to create our Third enemy, the Snake. This functioned well as a 3 in 1, as the snakes could infest corpses and bring them back to life. I wanted to have humanoid enemies, but didn't just want zombies, so decided to give a unique spin on it. Hosts can be revived an indefinite number of times, so long as there is a snake to bring it back. Snakes can't come back, and are relatively weak and incapable while outside of a host, but can be rather evasive. To lighten to load and to keep with the One Programmer rule, each of the hosts were coded by a different person. I programmed the Gunslinger, John programmed the Miner, and Eric Norfleet, our Lead Programmer, coded the Base host civilian and snake outside of the body. 

On my side of things I was still juggling the wolf and the gunslinger, but was able to manage quite well. It was interesting working within a framework and communicating with the other two programmers, ensuring each enemy had it's unique specalties, while still having the capabilities of the others. Needless to say parenting was very useful into preventing redundant work, as both me and John worked with Child classes of the base host. The gunslinger was the most simple to implement, both programming and animation wise, which was perfect while juggling two designs at once. Our gunslinger became the star of the show for a brief period of time, being showcased as one of the first enemies people fought at the GDC showcase. as mentioned the implementation wasn't exceptionally difficult, but the most fun I had on it was working with animation. 

To get the Gunslinger ready in time for GDC I worked with Luke DeSimone and Ray Turpin to get the animations done. Unlike our more bestial enemies, we decided we could Mo-cap the gunslinger. Ray had a home MoCap setup so me and Luke got on call and gave direction for the animations to be implemented. Many of the Mocap animations were used in the GDC demo, and we were able to fill the gaps with Mixamo (my arch nemesis). It was an incredible experience to be able to convey my designs to the Animation team and directly influence the final animations used for the finished product!

As for Eric and John, it was a similar feeling to watching the Scorpion come to life. Again, many hours of communication were had between the three of us on the implementation side, but my designs remained mostly unchanged, only minor tweaks for scope and feasibility within the timeframe we were given. I am once again blown away by how these enemies turned out and proud of what we were able to do collaboratively in the time given. 

As The first Quarter came to an end, we prepared for our first major presentation, GDC. The Game Developers Conference was absolutely incredible, but nerve wracking all the same. Putting our work in front of all different studios was exhilarating and extremely encouraging. people from Insomniac, Bungie, Blizzard, Sony, and Santa Monica studios just to name a few, came to see our work. I was lucky enough to be able to chat with the Senior AI programmer at SIE London about my work and his feedback was exceptionally valuable. Overall the reception of the game at GDC was amazing, many people were amazed at what we were able to accomplish in just 10 weeks. 

Returning from GDC we had all kinds of ideas from the feedback given at GDC. Additionally around that time Me, Eric, and Kano Magpuri (our new Level Lead) were lucky enough to have lunch with Seth Smith, a Senior Game Designer at Riot working mainly on Valorant. While there we chatted about Core Pillars of Design, much of our work had been done rather loosely based on the rule of cool, and as such, we were missing a design based backbone to our game. Seth Smith was able to show us how to design those Core Pillars. Briefly after lunch the three of us adjourned upstairs and made the Document at the top of this page. Over the course of the next quarter we were able to produce a vast amount more weapons, items, and enemy designs than previously, all thanks to the three of us ironing out those core pillars. 

Production began quickly during Spring Quarter, and I was able to go back to the drawing board and design more enemies for us to fight. We noticed that, while there was a decent amount of variety in the enemy design, we were rather sparse on boss Designs, so I took to the task of designing our 3 main bosses. Boss design is a huge passion of mine and as such I think I had the most fun coming up with unique designs for each of our 3 big bads. By the end of the first week, I had paper designs complete for the Amalgamation, the Vulture, and Sage (the final boss). 

As we only had 10 weeks to work we needed to prioritize quite efficiently. Additionally we had a hard cut for features at week 6, leaving us about a month to polish the game. I began working first on the Vulture, as that had a place in our GDC demo, trailer etc. Sage was currently unmodeled, and the Amalgamation was unrigged, as it's many limbs and moving parts proved quite the challenge. The Vuture, however, was rigged animated, and in engine, so I took to doing dry move implementation as the animation team got to work animating the vulture in combat. 

Needless to say, after completing as much as I could without the animations, I was bouncing back and forth fixing various bugs with the Enemies and improving them for general gameplay usage. I delegated John to make our one new enemy for this quarter, the Spider. It was a relatively simple design but broke up the combat extremely effectively and acted as an incredible ranged support for the rest of our enemies. The Spiders would fly from wall to wall, lay an egg and keep going. After a short delay, the eggs would hatch and shoot a ball of tiny spiders (in particle form) at the player to damage them. This broke up our sight lines, as many enemies were grounded, and gave us an enemy that would work well in tight corridors, as a lot of our other enemies had some flocking difficulties. 

Speaking of Flocking Difficulties, a common thread throughout the entire process of this quarter was fighting with the Navigation Mesh. Due to some issues with the level pieces we were working and their geometry (I'm convinced it has to do with Nanite) the Nav mesh would develop what I call "seams". Nav mesh seams happened when there was apparently an irreconcilable difference in height between two seemingly flat pieces of navigation, which would cause a razor thin break in the mesh that could cause enemies to get stuck and be unable to traverse the area. Once again this only seemed to happen on flat or very slightly angled floors, where nav should be no issue, and as such it affected a ton of our larger combat arenas. 

Any moment I wasn't working on boss implementation or other things was dedicated entirely to Navigation. In the levels itself, I had to jostle each floor tile individually, to raise or lower it and compromise where the navigation would go, however outside or in certain areas, placing an object with collision in the middle or the corner of the Nav Seam would stitch the mesh back together, and that's why there are some random barrels sitting in the middle of rooms. 

After completing the vulture as best I could, I moved onto Sage. Since she was still in the process of being modeled, rigged, and animated, I ended up using Mixamo placeholders. This proved incredibly valuable, as it allowed me to entirely program and finish the fight with the placeholder animations and gave the animators a working reference for the timings and her abilities. Needless to say by the end of production, all our custom animations blew the Mixamo stuff out of the water, but it was excellent to allow me to work as quickly as I could. 

At around this time I began on the dry runs of the Amalgamation, much of it was similar to the other two, in the sense that I could only do so much without animations, but it was good to create the general framework. For the Amalgamation specifically, I worked with our Level Lead, Kano Magpuri, to create a unique arena for the Amalgamation. I wanted the fight to seem like it was hunting you, so we made a mazelike room in which while it was far away from you, you could only catch glimpses, until it was right on top of you and trying to kill you. Lastly we added in boards to give the player a limited resource they could use to provide distance. The Amalgamation could break these boards, but it took time, so it was an interesting risk v reward, and choosing when to use the boards and when not to. 

The Amalgamation was massive. and unfortunately our arena was initially a little too tight. I went in and remodeled the arena, making it both larger for the Amalgamation and providing certain places off of the navigation that the Amalgamation couldn't reach, but the player couldn't attack from. I additionally implemented my own version of our universal cover system (programmed by John LaRochelle) that would check if the player was in one of these nooks and the seek cover, to give the player a sense of dread at losing the positions of this giant monster. 

There were some navigation issues in this room, but no seams. Something within the base movement component that was coded last quarter didn't play nice with certain parts of the Amalgamations arena, but that was easy enough to fix. At that time the 6 week cutoff point was hit and it all went down to polish. I handed the Amalgamation off to Eric, our lead programmer, as I was deep into navigation fixing and encounter design, as well as polishing and implementing the animations on Sage and The Vulture. 

The last 4 weeks were relatively monotinous. Nothing of major importance or creation happened on my end of things, mostly just implementing animations, overhauling Animation Blueprints to work with updated rigs, and polishing player facing variables on the enemies, like speed, damage, and the like. I added in universal damage and HP scaling per dungeon floor for the enemies, as well as continued to improve Navigation. 

I additionally did several encounter passes, ensuring each area had a good variety of enemies that would scale with the level and would have enough room to navigate and fight in each area. I additionally did Hazard passes on each level, adding toxic gas volumes, damaging steam pipes and explosive barrels to several encounters. During the final week of the project, I had finished most, if not all of my work and got some time to relax. As some final animations, particles, and other odds and ends came in I would implement them, but overall I was rather proud of how fast I completed my work. 

In total I'm rather proud of how my work on this project came out. I feel as though my designs made it into the game relatively unchanged, and I was able to successfully direct and implement many of them myself. We had way more animators our second quarter than we did the first, and I can't help but wonder what we could have accomplished if we had such a great team for all 20 weeks. I was blown away with how fast and efficient they were. 

On the other side of things I can't help but feel that some external factors from some teams really held us back in key areas. I think with a team this large, it's hard to pivot away from ideas that might not be the best. With our design team it was relatively easy to switch or tweak certain mechanics, so long as it didn't affect art. SCRUM and Agile are certainly excellent methodologies for keeping work on track, but by the end there, almost all development was waterfall style, and trying to jam it into a sprint sheet only hurt morale. 

Speaking on morale, while I didn't really become affected by it, team morale was dwindling by the end rather harshly. Even after our first quarter, many people who could have assisted were burnt out or entirely uninterested. While I don't want to throw blame on others for not being able to pull their weight, I still wonder sometimes what we could have achieved, especially if we got a proper break mid way through development to rest and recuperate. 

Overall I'm exceptionally proud of what we were able to accomplish, but am certainly aware of the faults that lie in managing such a large team, and the pitfalls, both physical and emotional, surrounding a faster paced, high intensity workplace with tight deadlines and occasionally less than encouraging support from higher ups. I feel as though I gained incredibly valuable experience, not only improving as a designer and getting to flex my enemy design muscles, but in working with a team this size. 

While I wasn't a producer I still took it on myself to check in on people, communicate between teams, attempt to boost morale myself, and many other things. I think the experience is as close to AAA experience as one can get without working in the industry. between the team size, production deadlines, Sprint setup, and hierarchical structure of our development. I think it was also an incredibly valuable lesson in avoiding Burnout. 

I still don't think I've been truly burnt out in my life, but that mainly comes from ensuring I have a good work/life balance. I was able to work virtually unscathed because I knew my limits and knew when to push myself and when to back off and rest. It was difficult to watch some of my peers burn too bright early on and burn out before the finish line. However it also gave me the valuable skill of managing others burnout, making sure to spend time with people outside of class, make the workaholics take breaks and do something fun. I also gained a good understanding of how burnout affects what a person's workload can be, and how to work around that, shifting weight and balancing out. 

Once again, I cannot express how proud I am of our team for accomplishing what they were able to do in the short time frame given. I specifically want to highlight the incredible work or our Animation team, lead by Luke DeSimone, our Sound Designers, Beth Latta and Gabriel Taylor, and my fellow members of the design team, especially for John LaRochelle for jumping into the deep end of AI with me.