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.
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.
- Make a game with just walking and scanning
- No power-ups or goodies
- Objective of just escaping undetected instead of collecting something
- Further cuts
- Many heros to one
- One simple, interesting map
- No HUD, just player controls needing no tutorial
Non-technical Tasks
- Help text
- About screen
- 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
- 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!
- Colour-based Picking
- Writing geometry-based picking for a game jam is an overkill!
- Issues with inverted-Y and alpha (buildings) in reading texture
- Drawing
- raylib 2.0 doesn’t offer Bézier curves
- raylib expects filled figure points ordered counter-clockwise
- Porting JavaScript to C++ (FoV code)
- Functions returning
undefined
replaced withstd::optional
- Multiple return values with structured bindings (C++17)
- Functor of
Array.sort
vsstd::sort
(< 0
vsbool
)
- Functions returning
- Building raylib for WebAssembly
- Issues in Emscripten build scripts
- Exceptions in enabling VAO support and querying game pads without sampling game pad data – now fixed
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.
A friend/colleague of mine and me. ↩︎
Here’s a shorter post I wrote immediately after the jam. ↩︎