Jam post mortum - by CoByte


Hi all, CoByte here!

Monster Parlor is the most ambitious jam game that I personally have ever attempted (that we actually mostly finished), and I wanted to write up what my experience working on the project was like. So here it is!

The Good

This was my 4th jam, and my first time working in a team of four. To my delight, this went much better than I expected. My teammates smallbug, meta, and dogoryx all worked together surprisingly well. We organized even better than normal, rarely stepped on each other’s toes, and did not kill me in a fit of (probably justified) rage. I’d especially like to highlight dogoryx, for whom this was their first jam(!!!). They put in a huge amount of work, including all the monster sprites, and I think they really killed it.

Additionally, this was smallbug and my first time using GameMaker (aside from some tiny test projects rights before the jam). Prior to this, we’d exclusively used processing (yes, that processsing) to make games, which gave us a lot of control over core abstractions, at the cost of basically everything else. We’d both found Unity’s UI design unusable, but GameMaker seemed to offer a lot of what we wanted. And in many ways, it did!

  • The editor layout was really nice to use.
  • The sprite and room editors were a big step up from the handrolled garbage I was used to in processing.
  • The event-based abstraction was a little primitive, but quite nice for whipping up something very fast.
  • The intellisense was fantastic. Honestly incredible work, it successfully identified types based on context 9 times out of ten, which is better than most JS LSPs manage without TS annotations. All in all, GameMaker was a smoother, faster, more ergonomic experience than using processing 9 out of 10 times.

But for that tenth time…

The Bad (about GameMaker)

I promised myself not to spend the entire devlog winging about GameMaker, so I’ve concentrated it all in this (excessively long) section. If you don’t want to read an annoyed amateur complaining about something they don’t understand, feel free to skip this!

During my time with GameMaker, I got a very strong sense that the entire program is a well thought out, usable, good piece of software, built on top of a truly terrible foundation. That foundation is of course, GML. GML is a boggling programming language. It feels like a painful fusion of C and JavaScript, with its own piles of weirdness stacked on top. There are a whole bunch of issues that come out of this, but I want to focus on the two issues that I ran headfirst into.

First, handles. Because GameMaker is dynamically typed, all of its references to assets (be they instances, objects, sprites, or whatever else) are all interchangeable, as far as the compiler is concerned. Specifically, they are all represented by a “handle”, which is basically just a number (like a pointer!). However, unlike other dynamic languages (like say, Python), GameMaker makes no effort to check if the type you’re passing around is actually the type that is needed. And this might be fine, except for the third, truly incomprehensible decision. Handle IDs are assigned SEQUENTIALLY, BY ASSET TYPE!!! Does that not sound so bad? WRONG. If you pass, say, an element id where an object id is expected, it won’t fail to compile, or even crash at runtime, or even corrupt the existing element! It will instead silently *refer to a completely unrelated object with the same handle number as your element. And because these numbers are assigned sequentially, overlap is virtually guaranteed. I know this is a lot of complaining, but this is a problem that could have been fixed by doing practically anything different, and it cost me hours of debugging.

Second, (and this one really sucked) inconsistent web builds. When smallbug and I decided to use GameMaker, the biggest draw for us was the ability to build our game for the web. Having done multiple jams, we’d realized that having to download a game was a big turn-off for players, and the web makes the whole project way more accessible (and also it was highly encouraged for the Winter Melon Jam, so there’s that). And so, when we made the web build in the final hour of the jam, and promptly ran into a truly incomprehensible bug that did not exist on windows or mac, it was utterly soul crushing. Now, to get it out of the way, I am fully aware that making a build for the first time only an hour before the deadline is a terrible idea. And I am also aware how difficult web compilation is, especially without any use of WASM. I honestly can’t blame the GameMaker devs, but I still feel the desperate need to express just how agonizing this bug was.

At this point, you’re likely wondering what the bug was, and how we fixed it (after all, there is a working web build on the itch page! (that you should go play right now if you haven’t (if you haven’t played it, what are you doing reading a devlog??))). In broad strokes, the bug was caused by a very specific instance suddenly jumping to a new location and staying there every time we changed rooms. As for how we fixed it: we didn’t. Or rather, I slapped a bandaid fix that prevented the instance from ever moving again, and we moved on. I still don’t know what the actual issue was, and honestly I no longer have the capacity to care. This bug broke me.

Conclusion

Congratulations, you’ve made it through a solid page of complaining (or you skipped it, in which case I applaud your refined decision-making skills). All in all, despite what it might sound like, this jam went exceptionally well. We finished with a completed game, that actually worked! Sure, there are a bunch of things to improve. But after 55 hours of work, and putting my whole heart, soul, and sanity into this project, I can honestly say that I’m happy with the result.

CoByte out!

Get Monster Parlor

Leave a comment

Log in with itch.io to leave a comment.