I had a great first experience participating in a game jam – 5th Alakajam. A three-day game jam where we1 wrote a primitive, real-time tactical strategy game: Sneak Out. The game is playable within a browser, thanks to raylib and WebAssembly.

Sneak Out! within the browser

Sneak Out! from within the browser

I’m a person with a decent degree of analysis paralysis. A code jam was the perfect antidote to kick me out of my rut! Here2 I document the high points, road blocks and solutions.

Hurdles Crossed

We hit a lot of roadblocks which we swiftly hurdled. Normally I’d have spent days or weeks to “solve it perfectly” – a fool’s errand. A game jam makes you realize that the clock is constantly ticking and you don’t have that kind of time.

Scope Minimization

This is the most important step in the entire process. When you approach a new project, remember Gall’s Law:

A complex system that works is invariably found to have evolved from a simple system that worked. A complex system designed from scratch never works and cannot be patched up to make it work. You have to start over with a working simple system.

  1. Make a game with just walking and scanning
    • No power-ups or goodies
    • Objective of just escaping undetected instead of collecting something
  2. Further cuts
    • Many heros to one
    • One simple, interesting map
    • No HUD, just player controls needing no tutorial

Non-technical Tasks

  1. Help text
  2. About screen
  3. Game balance (tweak b/w too hard vs too easy)

These are absolutely needed to call something a game rather than a tech demo. When there’s a good-to-have feature vs showing help for an existing feature, choose the latter. I find it odd to even state this, but many developers naively overlook this because it isn’t as fun from a programming viewpoint; the ROI however is inversely proportional 😉.

Technical Issues

  1. Visibility-based Pathing : Porting my A*-based path finding JavaScript code to C++ looked like a daunting task; some how the idea of visibility-based path finding sprung to mind!
  2. Colour-based Picking
    • Writing geometry-based picking for a game jam is an overkill!
    • Issues with inverted-Y and alpha (buildings) in reading texture
  3. Drawing
    • raylib 2.0 doesn’t offer Bézier curves
    • raylib expects filled figure points ordered counter-clockwise
  4. Porting JavaScript to C++ (FoV code)
    • Functions returning undefined replaced with std::optional
    • Multiple return values with structured bindings (C++17)
    • Functor of Array.sort vs std::sort (< 0 vs bool)
  5. Building raylib for WebAssembly

Developer Art

Managing to get cohesive, working code was load enough. We didn’t have time to spend on game art: searching, polishing, fitting, etc.

I’d to quickly create a map using Krita and a Huion tablet in half hour; thanks to Pixabay for the background.

Characters were drawn with code; cobbling a triangle to a circle did the trick. 👍

Bottom Line

Game jams and code jams are great exercises – not just technically but (project) managerially too! Most of my learnings were in this area. Of course, depending on your existing skills, you may learn more technically.

Participating in a jam is a very refreshing and rewarding experience. Highly recommended to break the vicious loop of not finishing started projects.

  1. A friend/colleague of mine and me. ↩︎

  2. Here’s a shorter post I wrote immediately after the jam. ↩︎