The making of Duelity: A Global Game Jam project
What is the Global Game Jam?
The Global Game Jam is a worldwide yearly game creation event that takes place every January. Similar to that of a hack-a-thon but with a focus on the development of video games. Many different game jams happen all over the world constantly and are hosted by many different groups. Most are done online. The Global Game Jam, however, sets itself apart by being one of the only worldwide game jams. Teams normally participate across the globe in person at various venues, all working with the same deadline and parameters. However, due to the Covid Crisis that had been plaguing the world ever since 2020, the Global Game Jam had switched to online only. Even with it just being online it was still a massive event worth attending. I wanted to attend. I wanted to make a game.
Getting the Team Together
Before I could make a game I needed a team. It started when I stumbled across Kendrick posting that he was participating this year through his school, APU (Azusa Pacific University). So I reached out to him. I wanted to see if I could join that site and if he wanted to work together. Kendrick was a music major going for a master's in music composition, and he was also an officer of the VGDC (Video Game Design Club), just like me. We had even worked together on a former game jam. So even though we weren’t close, we knew each other. He let me join the APU site and agreed to work together.
Now that I was committed I started blasting out messages, reaching out to old contacts trying to get a few more people together. Yasmine was the next to join. She’s an amazing artist who is trying to go into 3D modeling and animation. The two of us had tried to work on a game last fall semester, but sadly, that game fell through. Still, we were on good terms and I was happy I got a chance to work with her again. That was one artist on the team.
Next up was someone who I hadn’t worked with before. AJ. A voice actor who somehow found the VGDC discord server and just joined recently. I reached out on a whim just to see what he was like. We hit it off. Turns out he had done professional VO work, on commercials to be precise. He was now back in school to go through the theater program, but he wanted to get into voice acting for games. I invited him to my global game jam team. I didn’t have a plan for a voice actor at the time, but he seemed friendly and I was certain we could find something. Rounding out the team was two more people. Eric, a level designer that Kendrick brought on, and Jules, an artist I had worked with before. One composer (Kendrick), two artists (Yasmin, and Jules), one voice actor (AJ), one level designer (Eric), and one programmer (Me).
As these teammates were joining, I was setting up a few things we would need. A discord server, a google drive, a design doc, a unity project, a GitHub, and getting each teammate set up. Setting all this up took a lot more effort than I was expecting. I can now see why project managers can be full-time jobs at studios. At least the good ones. I wasn’t going into this game jam trying to be any kind of team lead or project manager. That kinda just happened. I hardly even feel qualified for that role. But no one else was doing it or stopping me, so I just kept going.
Building the Game
Before most of the team had been formed, when it was just me and Kendrick, we already knew the theme. Traditionally the Global Game Jam is done in person. But this year it was completely online. So rather than run 48 hours, it was loosely running for a whole week. The theme was ‘Duality’. Kendrick and I met up to brainstorm a game idea. We initially went through the usual things you associate with ‘Duality’: light and dark, black and white, yin and yang, death and life. Soon though we twisted to word and focused on the ‘Dual-’ part. It sounds a lot like Duel. Like Dueling. This led us down a rabbit hole of Dueling games. We were hooked on this idea. Kendrick referenced this old game he had on his phone called Micro Battles; in it two players played one device and dueled each other as Vikings. I brought up games like Footies, or Dive Kick, both simple dueling games between two players. We decided to make something similar.
Thus the idea for Duelity was born.
It would be a western dueling game between two players on one device. Each player would have the following actions: Shoot: They would shoot a projectile at the opponent; Dodge: They would try to dodge the opponent's projectile; Bluff: They would act like shooting a projectile, but wouldn’t. The idea was rock-paper-scissors like mind games. Shooting would win, but your opponent could just dodge. But if you bluffed and they dodged, you could easily shoot them. The game would be five rounds of this quick game. This was the plan Kendrick and I landed on. We liked it and felt it was achievable with just two people.
Then we got more people. A Lot more people. Initially, I was hoping we could get at least one artist on the team. But instead, we wound up with a crew of six people, myself included. With so many more I tried to get everyone together on one voice call to have another brainstorming session. But that didn’t work out. Turns out it’s hard to get six people free at the same time. So instead we had made a small design doc for Duelity and just made that game. Everyone liked the idea anyway.
Just like that we were off and making the game. I started coding the skeleton of the game mechanics we would need for the project. Yasmine, Jules, Kendrick, and AJ got together to figure out an art style to go for. They landed on Cowboys vs. Aliens. From there Jules made an old west town background for the game as well as a few UI elements. Meanwhile, Yasmine designed, drew, and animated the two characters for the game. The Cowboy and the Alien. Or rather Cowgirl and Parasite infected Alien to be more precise. For AJ we decided to have him voice both the Cowgirl, Alien, and an Announcer as well. Eric hopped on to help out with the dialogue for those characters.
Coding Stuff
I can’t speak to any challenges or hardships they faced in their work, I can only speak to the final product and my work. The coding. I started by breaking down the mechanics we needed and working on them one at a time. In a broad sense, we needed the Main Menu, the Gameplay, and the Inputs. I started with the Main Menu as I have made those several times before on past projects. This is usually put off till the last minute but is crucial for a good game. Getting the basic structure of buttons working didn’t take long at all. Next, it was on to the Gameplay and Inputs. Under Gameplay were both of the player characters, the actions they could take, the game manager that recorded the score and started and ended each round or game. The Inputs were all the buttons the player could press to affect the game or anything an AI could do in the game as well. I’ve found it’s always good to separate these systems as it lets you work on one without needing to worry about the other. This way I could theoretically easily port the game from PC to Mobile, Console, another AI, or any other controller configuration. This is the basics of OOP (Object Oriented Programming) after all.
Of the two I started by working on Gameplay. At its core, I needed the player characters able to perform one of three actions. So I started there. I made an Action Manager that could record all available actions, which the player was currently in, and which they could select. Next, I recorded each action separately. This way each action could be modified on its own. The shoot action needed to fire a bullet, the bluff action needed to not do anything, and the dodge action needed to make the player invincible for a time. Also, all needed to play their respective animations. I stated with the shoot action first, firing the bullet was just Instantiating a Prefab which was easy enough. Getting the bullet flying in the right direction was where the real challenge was. Vector-based physics always confuses me. But I got it eventually. Now that I could shoot stuff, I made a health system so stuff could get shot. Once this physics bullet detecting system was in place I could hook the dodge action up to it, turning it off briefly.
With all the actions in place, I started working on a game manager-script. This needed to start each round, end a round if a player was shot, update the score, and end the game if a max score was reached. Well, most of this wasn’t new to me, the problem came with the round start and round ending sections. See, I would need to stop the round, play a count down, and start the next round. I had no idea how long this count down would be as AJ was recording the voice lines for it. I also wanted some countdown graphics to show on the screen. I could hard code all this, but that would be a nightmare to manage. I didn’t even have audio files in from AJ yet, so whatever I made now would need to be adjusted to match his timings. In came a solution. The Unity Animation system. Initially, I had assumed the animation system was just for animating sprites or 3D rigged models. Turns out you can do a bit more with it. You can use it to animate or move anything within the unity scene. Move the camera around for a cool effect, turn on and off game objects, and even trigger functions in scripts you made. That last one takes a bit of finessing though. See, I normally like to separate things into different objects in the Unity Scene. So while the animator was on one child of the player character, the scripts I wanted to trigger were on other children. And by default, the animator can only trigger functions of scripts of the same child it’s attached to. But by using a series of pointers and relay events I was able to work around this.
Even with all this, the animation system was not easy to work with. First, Unity doesn’t really allow you to make an animation separately from the object that’s being animated. This also means you can’t reuse animations for different objects as well. Also, I ran into a bug numerous times where I would have to make a given animation's keyframes twice for it to actually save. And lastly, the animator, the state machine that lets you blend/transition between individual animations, wasn’t always clear as to what animator you were looking at. Well, I may be coming down hard on the system; my challenges were probably a mixture of two things. Firstly I had never really used the unity animation system like this before. So I was learning everything as I went. Secondly, the Unity animation system seems to be optimized for animating individual or singly continued objects, like a 3D model, or a 2D character sprite. Not for triggering a series of programming events, or game-wide transitions. Which is what I was trying to do. In the end, I got it working though, and it added to the polish of the game.
Putting It all Together
It was at this time that many of the art and audio assets started to come in. First AJ’s voice lines came in, he had even managed to do multiple takes of each voice line, just to see which one we liked. His stuff wasn’t too hard to implement, Unity already has a pretty robust system of audio tools as it is. I was even able to set up a system that could randomize which audio take it went with whenever it was triggered. This way we could add some variety to the announcer or use multiple victory lines for each player character. Going back through all the animations and adding these audio clips took time, but was not particularly difficult. Next up Kendrick delivered two music tracks for the game. One for the main menu, and one for the game. Using the previously mentioned animation system I was able to make a music manager that could fade in and out of any given soundtrack on cue. I even set it up to automatically trigger when a unity scene was changed. This way combined with a fade to black scene transition added to the polish of the game. Neither are features any player would notice immediately, but they would certainly notice if those features weren’t there. After this Jules delivered the background art he had been toiling away at. I was able to plug this into a skybox material to have it always fill the screen regardless of the screen size. Last but definitely not least Yasmine sent me the character sprites and their animations. Unfortunately, we ran into a few problems here. See, unity is very particular about how it handles 2D animation. Normally the way you would do it is with a sprite sheet and using the Unity Animation system. I was given a series of still images for each character and GIFs for each animation. Unity doesn’t like GIFs. The base unity doesn’t support them. Sure it will show the first image of a gif, but it won’t play the gif. This was a problem.
One we could solve if we had time. Sadly we were only two hours from the hard deadline. Within two hours we would need the game finished, built, and uploaded to the Global Game Jam website. The building and uploading process alone could easily take an hour. This is because Unity would need to compile the project files into an executable, then I would need to compress that into one zip file. Lastly, I would need to upload this online. And since we were approaching the deadline the servers were guaranteed to be slow with everyone else trying to upload their game at the last minute. This was not even including making our game page look nice on the global game jam site. Lucky with some foresight we already had the web pages up and ready to go. We just needed to upload the game file.
Of course, before any of this could be done we had to finish the game, which meant getting the animations working. With the short time, we had left we just worked with what we had. Where the animations would have been I just flipped to the first frame of the gifs I was given. Given how fast-paced the game was it still worked. Most of the gifs were only 2-3 frames long anyway. It worked, it looked pretty good, and Yasmine was happy with the final results. So regardless of the stress it caused, it worked out in the end.
After getting the animations sorted I went through the motions of building and uploading the game. We posted it both to itch.io and the ggj page. And just like that, the game jam was over. In the course of a week, we had gotten a team together, brainstormed a game, broke up the workload among everyone, made our pieces, put those pieces back together, and released a game. It was an amazing experience.
Looking Back
I’ve done several game jams before, and at the end of each one, there is always an immense feeling of accomplishment. Normally I’m working by myself and have no one to share that accomplishment with. This time I was working with a team, so we could share in the accomplishment together. We even got to show off our game afterward. I had a blast working on this game, with this team, and learned a lot. On the coding side, I learned a lot about the Unity Animation system and various ways to add cool transitions or polish to a game. On the people side, I learned just how much work goes into managing a team. I did not set out planning on managing a team, it kinda just happened. I know some may look at this as humble bragging or some form of boasting. I was not trying to manage the team to boost my own ego, but just because I really wanted to participate in the Global Game Jam. The team wasn’t working for me, they were working with me. And I with them. There was no way any one of us could have made the game we did on our own. Communicating with everyone, setting up the discord, google drive, design doc, and even getting the team together, was all a lot more work than I expected. But it was a good learning experience. Both of these lessons, those I learned on the coding side and the people side, I will carry with me into my next project.
Files
Get Duelity
Duelity
Dueling with Life and Death
Status | Prototype |
Author | Digx7 |
Genre | Shooter |
Tags | Co-op, Local multiplayer, Multiplayer, Short |
Languages | English |
Leave a comment
Log in with itch.io to leave a comment.