To say that I romanticize game development would probably be an understatement.  There is a certain allure to creating a world that other can live in and explore.  Where the realities of life seem to fade away for a short period of time.  Perhaps this is what has always drawn me to Dungeons and Dragons.  I first heard about Ludum Dare 3 years ago when I first started entertaining the idea of making my own video game.  The Ludum Dare Jams are held twice a year and the premise is simple, you are given a theme, you then have 72 hours to build a video game around the theme.  You are starting from scratch, no thoroughly thought out and story boarded ideas.  While the premise is easy, the actual art of creating a game in a very short period of time is daunting.  All the things that game companies spend weeks, months or even years on, must all be completed in a measly 3 days!

Historically, these bi-yearly events have fallen on days I have had other priorities, birthday parties, scouting events etc.  This year however, the jam fell on a weekend where I could participate.  Ludum Dare 45 ran from Friday 10/4/2019 @6pm until Monday 10/7/2019 @6pm. I took the opportunity and cleared my schedule for the weekend.  I warned my family that I was going to effectively be absent for that 72 hour period, and even went so far as to schedule time off on Monday so that I could give the jam my full focus.

Prep Work - The days leading up to the Jam

In the days leading up to the jam, there were some things I had decided I wanted to do.  First was to clean my work space.  My desk tends to get cluttered with various projects layabouts.  I have recent been working on painting some miniatures so all that needed to be cleaned and put away.  I also wanted to make sure all my tools were updated.  As I work with Microsoft products in my professional life, I use them for my less professional life as well.  This meant I needed to make sure Visual Studio was updated.  Unity is my preferred game development tool, I say as if I'm some sort of expert, so I also needed to make sure that was updated.   Along with clearing my work space, I laid out some materials I thought I might need.  A small stack of papers, some sharpened pencils, an assortment of pens, a rule... you get the idea.  I planned on streaming my progress... or lack there of, so I updated my twitch account and made sure everything was set.  Despite my prep work, there were a few things I missed that I should have prepared for.

  1. Test things - In hindsight this was an obvious miss.  I updated my entire suite of tools, and did not test that they were working correctly before the jam started.  Total n00b mistake.
  2. Figure out what the dog is going to be doing when the family is out of the house.  We have a puppy, she can not be left alone to roam the house on her own.  This is normally not an issue, she is trained to be in her crate/bed when we are not home.  She is not, however, used to being sequestered into my tiny office while I feverishly grind though a game jam.
  3. Plan some healthy foods.  My wife and I had just finished a diet a few days before the jam, so I was using the jam as an excuse to stuff my face with as much pizza and soda as I could stomach... and I did.  This however made me feel lousy, and blah at various points during the 72 hour period.  I am sure these feelings impacted my performance.
  4. Understand the Voting system.  Leading up to the jam, Ludum Dare accepts suggestions for the theme.  About 2 weeks prior the community is allowed to "Slaughter" the suggestions.  The top 10 or so voted suggestion make it to the final round of voting.  One of these suggestions ends up being the final theme.  I did not know about the last part of this process and as a result, I went into the jam completely blind.  More savvy Jammers (is that a thing?) use this list to start brain storming ideas for each of the possible themes, so they have a small leg up when the jam starts.

The Jam Begins

6pm Friday rolls around, I have my pizza, I have some water and snacks, and the Ludum Dare count down up.  The theme comes up, "Start With Nothing".  This is where the first challenge comes in.  What game can I make, where you start with nothing.  What does that look like.  Is it something like Minecraft, where you start with nothing and collect, craft and build to survive?  Do you start with no memories, and you are looking to remember who and what you are to accomplish some goal?  I spent about an hour brainstorming ideas, trying to find an idea that a) fit the theme, and b) and probably most importantly, something I thought I could build during the jam.  I eventually settled on the idea of a top down shooter where you have nothing.  No weapons, just yourself, and there are enemies spawning on the map trying to kill you.  This felt like something I could build and complete by the time the jam was over.  So I hunkered down with my fresh idea and dug right in... and immediately ran into my first problem.  

Problems Galore

The first issue I ran into was that Unity and Visual Studio weren't exactly talking to eachother.  I wasn't getting intellisense on the unity libraries, the code wasn't linking it was just a mess.  I probably wasted an hour trying to sort though the problem.  It ended up being an issue with the dev environment that was set in Unity.  It was set to the generic devenv.exe which was fine for Visual Studio 2017, but doesn't work with Visual Studio 2019.  Once I switch this to be specific for Visual Studio 2019, I was off to the races.

I dropped a cube into the scene and started coding up the character controller.  I wasn't long until I had a controller that moved my character around the screen and followed my mouse.  Next I decided to work on the enemies.  I knew the wanted them to spawn and move around the map, but I also wanted to them to chase the player if the player was "seen".  I knew that to accomplish this I needed to use ray casting to determine if the enemy could see the player, but I didn't know how to make that work exactly.   I put my google-foo to work and found a few example of how to accomplish what I was looking for.  I dropped a sphere onto my scene and started coding away.  This is where I ran into my 2nd problem.  The enemies were not chasing my player.  They could see the player but they were not turning to follow.  This problem plagued me through out the jam, and it boiled down to a subject in college that I no longer use... Vector math...  specifically, the geometry of rotations when it comes to vectors.  It has been 20 years since I have done this math, and the concepts, while foggy and floating around in the deep dark recesses of my brain, were not things I was readily prepared to tackle. I heavily relied on other peoples understandings of these math concepts and leaned on google heavily to sort out my problems.  I even broke down and started graphic enemy movements with hand drawn vectors to understand where the enemy thought it was going compared to where I wanted it to go.  I eventually got it sorted out and working, the enemy chased my player and I could run away like the King Arthur when faced with some Cheeky French guys.  At this point, it was nearly 2am, and I decided it was time for a sleep.  I had accomplished some basics, and I felt like I had made a good step in the right direction.

The next morning I made myself some breakfast and got started on the next step.  To make the enemies spawn from a spawn point, and move out into the world.   My good friend vector math reared his ugly head again, and I again spent an enormous amount of time getting rotation correct and relative to the spawn point. Honestly, I think I spent more time working through vector math problems then I did actually writing game code.  I may need to pull out my old calculus book and work my way through it again so that next jam I have a good grasp of the concepts.   After many iterations, I finally had the enemies spawning, and I had the enemies chasing my player.  

One of the big things with the theme was that you were to start with nothing, which meant that at some point you need to collect stuff to defend yourself.  I decided I needed to make some weapons for my player, and my enemies.  I hopped over to Photoshop and started making some crude weapons.  While I was at it I made my character and my enemy sprites as well.  Before adding my weapons to the scene I decided to replace my place holder objects with my newly created player and enemy sprites.  remember above where I said I used cubes and spheres to represent my player and enemies? Yeah, this turned out to cause me more problems.  The scripts I had struggled to get to work right were now broken... because I used 3d objects and was switching to 2d objects.  Everything fell apart.  It took me midnight to get it sorted out.  Despite the late hour, and the itchiness of my eyes, I was determined to get the weapon pick ups working.  So, I struggled on.  I crated a single weapon, its bullet, and turned it into an object and get it setup to attached to my player.  This was actually very straight forward and worked right away.  Again at 2am, I decided it was time to sleep.

Sunday morning comes around.  I'm tired despite sleeping for 6 hours. I can feel my thoughts starting to fray around the edges.  I make some breakfast and have some tea.  I decide to write out a punch list for the day to kind of layout what I'm going to accomplish.  My day starts with generating the terrain.  I have written procedural terrain generation before so this was pretty straight forward to setup.  I then created the remaining weapons that I would need, and started thinking about the enemies and the weapons they were going to have.  I was toying with the idea doing this programmatically but decided my waning mental capacity couldn't handle it.  I decided to just make a few "template" enemies and I would make the spawn points spawn these templates based on the difficulty.  I still had pie in the sky dreams at this point and was thinking I could potentially get multiple levels into my game.

The last big thing I wanted to get done was a UI.  The game needed as main menu, I needed a way to escape from the game if you wanted to quit, and I needed a health-bar and a kill counter.  I initially wanted a UI to manage the weapons that the player picked up, but that would have required rewriting large portions of the project so I scrapped the idea.  By the time I finished all this it was 6am Monday morning and I needed to get my kids ready for school.  

After getting the kids squared away, I grabbed a 4 hour nap, and got right back to it.  At this point there really wasn't much left to do except add music, do some testing, and then publish it.  For the music I found a free chip-tunes song that I liked and felt fit the game, and some free sound effects for the spawners and the weapons.   Feeling good about things I built and ran the game.  I was immediately saddened to see nothing working in the built version.   My spawners weren't spawning.  I could pick up weapons but they weren't shooting, my game was not much of a game.

I spent the remaining several hours trying to quickly fix the last few things so that I could publish something that worked.  I found out that my spawners weren't tagged in unity, and as a result weren't running any of their code.  I sort of fixed my weapon firing, but not really.  The bullets come out, but just immediately disappear.  I'm still not sure how to fix that.  By 4pm I was out of time, and had other family obligation to see to, so I published the game as it was knowing that it wasn't going to be graded very well.

Lessons Learned

Ultimately I learned a lot from the experience.  I knew going into the jam that I wasn't likely to create the next block buster game.  What I didn't know is how little about the process I didn't know.  All the trials and tribulations with vector math were eye opening.  The hiccups from using 3d objects as placeholders instead of 2d object was a surprise, and that huge difference in functionality from IDE to build version were a nightmare.  I think I need to spend some time wrapping my head around vector match, specifically dealing with rotation.  Perhaps digging into the nitty gritty parts of Unity might help.  I am looking forward to giving it ago next time around.  I think knowing how the voting system works will help with formulating ideas prior to the 6pm start time.   

 

If anyone is considering doing a game jam I would highly recommend it. You will learn a lot, and it is a worth wild experience, even with the sleep deprivation.  For those interested there are some links below to the game, as well as to the source code for my game!

Links