I take pride in being the support programmer. Usually this ends up with me not being able to say “Hey, I made this section of the game”, but it does leave me as the person who helps the Designers be able to do the cool things they do. One example of this was abstracting out the QTE that another programmer wrote to allow the Designers to create QTE events at specific points in the game, and not tied to a single enemy. This process usually works out that I create helper objects that act as a facade for what is going on much deeper in the game logic. Along the way I usually end up refactoring parts of existing code to make it more accessible for other parts of the game or less of a mess. The final step is making sure the Designers know how to actually use the system I helped make. This usually involves setting up an example in the level and then telling them how to recreate it and being available for questions when they are first implementing it.
So, ever since we have worked on teams at Champlain, we have used Redmine as our project management system. Everyone has either learned to love it or hate it, but at least learned how to use it. However, none of that matters if nobody decides to use it in a proper way. Looking at the taskboard should be something to judge the progress of a team in the current sprint. However, when I see it, all I see is User Stories with no tasks, incredibly broad tasks that are marked as “In Progress” and many completed tasks with no one assigned to them. Everyone says they are doing Agile development, but they usually admit that they may not do certain parts of it. However, right now it seems we are doing our own development practice, and have decided to use they things from Agile development.
When being told that User Stories don’t work, something seems amiss. It’s true that User Stories don’t work when people just create them at any time and is seen as a gateway to being able to log time on a task. But if there was time spent planning before the sprint started to make sure everything was created then User Stories are great. I think part of this problem stems from the fact no one is taught how to use Project Management systems to their full potential. How does a carpenter make furniture if he does not know how to use a saw?
For this current Sprint, we have essentially abandoned Redmine in favor of the “Get Shit Done List”, which is just an excel document with a list of things that need to get done. What it looks like however, is just a spreadsheet of tasks that could be made in Redmine. Each item has a name, description, who it’s assigned to, current status, and priority. All of these things are fields for a Task on Redmine. Project Management is something everyone on a team should learn in order to be fully productive and allow everyone else to be working fully functionally.
For the entire semester, the way programming duties have been split up is between gameplay and engine rewriting. Coming into this semester, the majority of Dan Shredder was written in Blueprints, and it showed, the game could not run at 60FPS on anything except for the lowest graphics settings. The goal of the C++ transition is that it would help us reach the goal of having the game run at 60fps on the highest graphics settings. Today we decided to cut the rewrite that was being worked on for over five weeks.
The visible progress that we had on the C++ rewrite in those five weeks was very little. Externally, there was none, internally, we were only getting to the point where the game would be playable, but not in the way it was currently. The player could strum notes and songs could be played and all these individual functions were written. However, when it came time to start putting everything together, things starting breaking left and right. One of the biggest perpetrators of this, was that every system was very coupled into each other, unable to be tested until other classes were done. For instance, the InputHandler class required functions in the PlayerGuitarController class to be written, which those functions required the Fretboard class to be written, which required the Note Receivers to be written. This might seem like a worst case scenario, layers of layers of requirements just to get one thing working. However, this was commonplace.
The hole that was metaphorically dug while doing this C++ rewrite was also very deep. So deep in fact, that I never actually came out of it. I entered that hole when other team members were thinking about what to do this semester, and how we want to move forward as a new time. I emerged from that hole to a different landscape, as if someone built a city on top of that city. The game itself looked completely different. Ideas that were just that were implemented into the game. There was a very real disconnect between the C++ rewrite team and the rest of the team.
The problem with a hole is that by the time the hole is fully dug, there needs to be more added. We realized that by the time we rewrote the entire game, we would have to rewrite the new features that were implemented to work with the non- C++ code. And by the time we were finished with that, there would be new things to write. We would always be playing catch up, never fully being caught up to the rest of the team.
Over the past couple of years, there has been a surge in popularity of the Twitch streaming platform and due to this a few interesting phenomenon has happened. One of the largest and most well known ones was “Twitch Plays Pokemon”. The objective of Twitch Plays Pokemon was simple, beat one of the first Pokemon games via sending input commands through Twitch chat. It seems like a simple task, however, having thousands of people control a single character in a game turns into utter madness very quickly. It was a massive success and has even spawned it’s own category on Twitch. The most popular way to add Twitch Plays functionality to a game usually relied on a very roundabout way to grab input and manipulate the game. An external script to grab IRC input from Twitch and then send those inputs to the game. What I wanted to accomplish with this library is allow the developer to integrate the ability for their game to be played through Twitch without being too intrusive on the development of the game.
One of the first tasks that I had to implement for the library would be the ability to actually connect to Twitch Chat and read the IRC channel. Twitch chat is operated off of basic IRC principles except it uses OAuth authentication. Using a simple Unity Twitch IRC chat reader on GitHub I set up the library to open the IRC stream and read from it. The Library then will run two loops on different threads, reading input and sending pings back to Twitch’s server.The real part that allows for easy integration is the ability to bind commands to functions easily. A developer just needs to call the function that takes in a string and a raw function and will add it to a Dictionary. The thread that parses message input will now keep track of how many times that string command was said. All that needs to be done now is to ask the library for the most said command, tell the library to run that command, and then clear the previously said messages.
Things that I want to add in the future is an event system to the library. Currently, there is no way to know when you are connected/disconnected, when a message arrives or what it’s contents is, and when other seemingly nice to know things that happen. Allowing a developer to subscribe to message received events would allow for more diverse gameplay and could allow for using a different system than the default and only implemented, “Most Common is the most said” way of doing commands.
What I learned from this is how to interact with IRC Chat on a web socket, and how to think about library development from a perspective of, “The DLL is everything I can use, I can’t just go and make an edit to it.”
One of the reasons why I wanted to join Legitimate Studios on their quest to bring Dan Shredder to completion was that it spoke to me on a deep level. I was the one percent that played Guitar Hero excessively in middle school, and was enthralled by rhythm games. I was also that heavy metal head kid during that time, wearing an Iron Maiden shirt and listening to Megadeath while riding the bus to school. Dan Shredder seems that way to me. When I envision Dan Shredder rocking his way through hell, I imagine a very burly dude who has a deep passion for metal. In the times I can contribute to the world building and creative aspects of the game, I always mention how previous games such as Brütal Legend and earlier Guitar Hero games took themselves. They seemed more of a tribute to metal than mocking it. We should follow by example of these games. One of the largest modern perpetrators of this idea is Jack Black. Voice of Eddie Riggs, the protagonist of Brutal Legend, and front man to the band Tenacious D. Tenacious D in the Pick of Destiny was a movie released a decade ago that seems to match the type of metal that I imagine this game to be. One of my goals for this team is to help this game really show my passion of metal to the rest of the team and help build a love product of Heavy Metal that will rock the world.
One of the first rules about Game Development is that one needs to learn how to adapt to foreign environments quickly or else one will fall behind. Moving to a different team is can not that difficult, a new code base, maybe some high concepts about what the game’s architecture is. However, the new team that I moved to would be the most difficult engine changes I have faced before.
A Chinese philosopher once said, “千里之行，始於足下” , “A thousand miles begins with a single step.” This is true for both grand conquests and game production. Going back to the very formation of Team NAH, it was one that was never stressed. Some teams formed due to friendships, others formed from the remains of Production 2 teams, some were “formed” out of the leftovers. Team NAH in the beginning, had never worked with each other on a single game. We quickly formed as a team, and left it as that for months. It was not until halfway through the summer, that we realized that we should do some preparation/discussions about the coming semester. Still nameless at this point, we would suggest game ideas, usually tagged along with some joke or gimmick. When it came time to actually name ourselves, we were stumped. On a walk home from work one day, I jokingly said we should just call ourselves, “Names Are Hard.” We all liked the name and it somewhat reflected our relaxed nature of a team. It may have taken a couple of weeks to get the workflow going, but when it did, we were walking at a brisk pace. We planned everything in advanced so we know when things needed to be done, and what was needed from us for that to happen. By the end, all of us had a product that we were happy with. Even though we did not move forward into production, I feel like we all moved forward in our respective disciplines.
Individually, I believe that I am not a creative person at all. Aiding in the creative process of the team is something I can do in a roundabout way as a Programmer. Something I heard other Programmers talked about near the beginning of the semester was the “Programmer’s Veto.” In essence, the Programmer’s Veto is the idea that since you are the primary way to get ideas or mechanics into the game, then you have some extra say in how it exists in game. Now, some people would think of this as, “I don’t like this idea so I’m not going to do it” which is a toxic mentality, however, the Programmer’s Veto can be used in a positive light. Since I was usually closest to the game integration wise, I feel like I had a better sense of what was in and out of scope with the current state of the game/technology. This may sound like I was actually hindering the creative process instead of contributing to it, I can think of one time where I said “I don’t think we can do this with the time we have left.” After explaining to the team why I thought this, they agreed with me. The way I most often added to the creative process was the way I would add features to the game, sometimes sparking new ideas for other features.
There was one time throughout the development of The Root of the Problem where I had to think about how what I was doing was going to be used by other members of the team. Rewriting how enemies spawned came out of nowhere, and was a great way to spend a restless night. Previously, enemies could only be spawned with one wave, and in a very specific way, something that that needed to be changed so that spawning enemies could be done easier. When I was rewriting the system, the one thing I had in mind was, “What would be the easiest way for Scott [our Designer] to make interesting enemy arrangements.” After a couple hours of hacking away, I finally reached a point where spawning enemies was much simpler and more intuitive that the previous state it was in.
Some important key decisions that I had to make throughout the course of the semester was Git vs SVN, Unity vs Unreal, and The Root of the Problem vs our other prototype, Blind Faith. To be fair, the first two were questions that were raised before we even started development. The Git vs SVN debate is one that seems to be a foreign one to many of my peers. I know many teams that went with Subversion because they and everyone on their team already knew it, which are valid reasons. After talking with the team, they said that there was no preference between Git or SVN, so that might beg the question, “Why did you go with Git then?” The answer to that question is that over the course of the summer, I was growing accustom to Git and saw that it was being used much more than Subversion outside of the educational environment we were all used too. It may have caused some troubles when everyone had to switch from the SVN mindset over to a Git one, but I still think it was the right choice.
The next major decision was Unreal vs Unity. One of the main reasons we were wanting to go towards Unreal was the fact that from the start we did not want our game to have the “Unity” look that so many games before it had. We wanted to stand out and have people think that our product was not made in Unity. The downside to Unreal however, was that very few of us had ever done anything in it, let alone make a game. After spending a couple weeks during the summer trying to navigate through Unreal’s, at the time, atrociously lacking C++ documentation, I told the group that if we were to use Unreal, we could make the same thing in Unity at a much faster pace, and it would probably be much more stable. In the end, the main way to not have a game look like an “Unity Game” is to create a unique art style that either abandons the Standard Shader, or uses it to it’s fullest potential.
The final decision was probably one of the hardest and most important decisions I, and the whole team had to make. We were all very into the idea of The Root of the Problem since inception, but most of the faculty we talked to did not like the idea and loved the premise of Blind Faith, a game where the player helps guide damned souls out of hell by creating a path for them. I vividly remember sitting at dinner one night with the team and we were all discussing what game we should go forward with. Whenever we talked about Blind Faith, it seemed we all had a much less passionate tone about the game, compared to The Root of the Problem, where we would all sound excited to be working on it. We all knew it would be the harder game to pull off, and we went forward with it knowing that. The deciding factor for going forward with The Root of the Problem instead of Blind Faith was that we all wanted to make a game we would have fun playing and have fun developing.
Moving forward into Production, there are a few things that I learned that are not nice to have, but rather required to have in order to have a functioning team. The largest one was camaraderie and communication. Throughout the course of the development of The Root of the Problem, I wanted to keep working on the game because I wanted to keep working with the team. Looking at our slack, you would see both channels where we would just spam gifs, while at the same time daily scrum channels. This allowed us, or at least me, to feel comfortable addressing any concerns that there was with the game. Wanting to work with your team is probably the most important factor when it comes to game development.
“By the way you guys, I signed us up for GMGF.” Being told this was somewhat frightening news. GMGF, or Green Mountain Games Festival was about two weeks away, and our game was not in a state that I would be proud to show off to the public. It was in a raw state that many would consider to be visible still in the early stages of development. Not that much thought was put into the game itself, the systems were there, but there was not that much attention put into how they were structured. Various bugs were in the game that made restarting the game a thing that had to be done very often during QA Tests. Getting the game to a point that I would want to show it off to the public would take a large amount of work, but we managed to pull it off.
On of the primary concerns with the game was that spawning enemies was very rudimentary. You hit a trigger and it would spawn X amount of Y enemies spread across Z spawners. There was no way to offset enemy spawning or make conditional spawning. One of the first tasks I set myself up to do is rewrite how enemy spawning works. After a few hours working on a side branch, I emerged back with a much more robust way to handle enemy spawning. Now, each area has a set amount of waves. Each wave has a set amount of spawners that that specific wave can spawn from, what types of enemies can spawn in this wave, and how many enemies will spawn in this wave. The most important feature of this new system is that a designer can set if the next wave spawns off of a time delay, or off of a percentage of enemies being dead. This allowed us to set up a much longer level and more unique spawning systems. The best part of having this new spawning system is that it is very simple to create a new area and set up how the enemies spawn there.
The second feature that I primarily worked on in order to have the game be ready for GMGF was adding Quality of Life features to our grenade weapons. Heading into this sprint players had an unlimited number of grenades, couldn’t control how far they went, and couldn’t tell where they would end up. To address these features, there were a few simple changes, and some more complex changes. The simple one was to have the grenades use an ammo system that you regained more from enemy drops. The more complex fix was to preview how far the grenades would go. Due to how the grenades gain their trajectory, the path of the grenade is unknown until the object itself is spawned. To allow for a preview, I had to move a lot of the calculations from the grenade itself to the object that spawns the grenades. After that, it was a matter of graphing a kinematic equation, which thanks to some google-fu turned up Line Renderers being able to do such that.
Adding these changes to TRotP made me feel much more confident about how we showed the game off at GMGF, which a full report of how it went will be written in the upcoming weeks
There have been many a Game Developer to learn the hard lesson of, “Don’t commit anything right before showing your game off.” While this holds true, sometimes, it has to be done in order to make sure that what you are showing off does in fact, work as intended. That is how “OOPIBROKETHEBUILD” was created.
“OOPSIBROKETHEBUILD” is the one version of The Root of the Problem that is not in our builds repository, it only exists on a handful of computers in a room, probably erased at this point in time. It is a build of the game that has the unique feature of not having a version number. The whole reason why “OOPSIBROKETHEBUILD” exists is because the version of the game we were going to be using was unexpectedly broken to a level none of us knew going in. I was there setting everything up when we noticed a large amount of controller issues. Player 2 controlled Player 1’s attacks, Player 1 controlled Player 2’s weapon changing, sometimes there was a Player 3 so one person would have had to use a controller. In the state it was in, the game was unplayable, let alone testable. Now, depending the team, a multitude of options are presented when the build is non-functional. One can either pack up and go home, persevere with the broken build, or the option our team took; try and fix it. “OOPSIBROKETHEBUILD” was the product of trying to fix the problems very quickly, and it did work for the purpose it was needed for, but making “OOPSIBROKETHEBUILD” really showed how Team NAH interacts with each other as a whole.
What that interaction is is hard to write in words. No one blames anyone when something doesn’t go according to plan, we all shake it off and figure out where to go from the current point. With “OOPSIBROKETHEBUILD”, we all saw that the build was broken, and instead of trying to figure out what broke it, we decided on making a new build so we can keep on testing. As a team, we are all friendly with each other, and I think part of that is because of how we see The Root of the Problem. It’s a game we all enjoy the concept of, and enjoy working on. It’s an aspect I don’t see in other teams, that might be because I don’t see the internals of that team and how they interact, or it is not just there. All the other teams seem very serious about their games, while we are being serious also, but having fun at the same time, and I think that shows in our work and our presentations.
One thing that holds true for most modern gamers is the idea that, “Graphics rules all.” I believe this to not be the case, however, graphics do help hide a game’s flaws, or helps make a game standout amongst its competition. After almost a month of development, The Root of the Problem has it’s own art assets in engine, alongside finding a look that sets apart from the rest.
Due to this week being different, due to not having classes on most of the days, one would expect there to be either no work done, or a substantial amount of work done. Thankfully, Team NAH was the latter, and went into overdrive over this long weekend. We only had one of our enemies modeled going into this weekend, and coming out, we had that enemy modeled, rigged, and having an idle animation, our main character, Salt, being modeled and rigged, and having all of these being in engine and put into use.
Although that seems like it was only our artist who was doing a majority of the work, all of us were at it. As a team we went to QA Test our game twice since the last week. The first one giving us valuable feedback about how players felt about player combat and interacting with each other. With that information in mind, we refined the player controls and how the camera works. Now making it so the players can not run off camera from each other, causing problems such as the camera not dealing with elevation, random bugs causing parts of the game to break. All of which amounting to “OOPSIBROKETHEBUILD.exe”