It’s been slow-going, but Catacombs Plus development is approaching a state that might be releasable. My last proper progress update was in February (oh jesus), and since then I’ve made about 200 commits. A lot of that is internal changes, bug fixes, optimisations, etc – but there’s also a bunch of content. So, here’s some of the stuff I’ve done since then…

The levels

There are four level types, that number will probably remain for release. Each has different enemies, layouts, and graphics.

Here’s a rundown of each:

“Dungeon”

“Dungeon” is the classic style from Catacombs 51. Lots of zombies, lots of… dungeon-like stuff!

“Ghosts”

“Ghosts” has ghosts! They walk through eachother and you, and they are numerous. ut they are slow and can’t move diagonally. Probably comparable to a chess piece.

“Abstract”

“Abstract” is a bit too futuristic, with 2-wide corridors and square-ish rooms. Here’s you’ll meet the Stabber, which thrust at you and try and stab you, and the Emplacement, which sits there rotating throwing rockets at you.

“Hell”

“Hell” is like a corrupted “Dungeon”. You’ll find bats that teleport around you just before launching themselves at you.

Bosses

Boss levels show up every five levels, and are based around the main level themes. In each boss room you’ll meet one or more boss enemies, which are amped up variants of regular enemies. Beating a boss will get you five powerups, one of which will be a special powerup (if you don’t have it already), which grants you an ability you can use for the rest of your run.

Powerups include:

  • Dash, which gives you a little boost
  • Revealer, which draws a path to items and the ladder
  • Phantom, which makes you invisible and able to clip through enemies
  • Teleport, which teleports you to a random area on the map. Use it carefully!

New weapons

There are two new weapons over Catacombs 51: the Railgun and the Bouncer.

The Railgun has a beautiful eye-candy shot that can pierce and decimate anything in its path. However, it’s very precise and has a long shot time.

The Bouncer’s shot, as the name implices, bounces around! It doesn’t do a whole lot of damage though, and you need to wait for each bullet to expire before you can fire it again.

Powerups

There are two new regular powerups (in addition to the special powerups above) since February as well:

  • Speed Up, which increases your movement speed slightly.
  • Regeneration, which increases the rate your health regenerates.

Oh yeah, your heath regenerates now. Very slowly at first, but that’s what the powerup’s for.

I hate collision

If you’re wondering why walls are overlapping eachother, that’s because GM’s rectangle drawing functions aren’t actually accurate.

I ended up (probably again) reworking collision a fair bit, because it was a mess: you would keep getting stuck in walls, you would keep getting stuck in enemies, enemies would get stuck in eachother. My prior collision code largely used collision_rectangle or collision_rectangle_list, figuring out object bounding boxes manually. This was a poor idea, as GameMaker does not make it easy to calculate the actual bounding box it uses for an object (especially if rotation is involved.) The solution was fairly simple, at least: just use instance_place or instance_place_list instead, which uses the true bounding box of an object and just works as expected.

I also just removed collision rotation entirely anyway; object bounding boxes are always straight. This is just simpler and causes less issues. Objects still rotate, of course, the player can still aim and enemies will still look at their target, this just doesn’t affect collision anymore. The only exception is bullets.

The only remaining collision issue is that bullets can phase through enemies at low framerates: since the game uses delta-time now, if a game step takes too long enough, the bullet will move ahead too far and not collide with enemies between its positions. This I hope to have fixed by release, probably by stretching the bounding box of the bullet somehow, but it’s low priority - if the game is running that slowly then it probably won’t be pleasant even if the bullets work fine.

Other bits

The HP bar is now a fixed-size bar drawn dynmically instead of just sprites rendered next to each other. Its colour also changes depending on your heatlh percentage.

Otherwise, it’d easily go off screen as you collect max HP powerups.

The death screen now shows the run duration:

and the history menu now shows that and your death reason:

What next?

Balancing! That is the one thing I have to do before I can call this a thing I actually want to release. I still have a couple ideas for additional features, but I’ve spent a lot of time focusing on individual features that I need to take a step back and consider the balance of the game as a whole.

There is also one glaring optimisation I could make, which is to initialise the behaviour trees for my enemies only once. Right now, they are initialised once per object, but it shouldn’t be too hard to make them global, so they only need to be initialised once ever. This should hopefully result in massive memory usage savings, since the memory usage of structs in GameMaker add up quickly. The only problem is that instance-specific data is passed to nodes when constructing them, which I’ll have to figure out how to work around if using single global instances of the behaviour trees.

Then test it and fix any bugs, then… release. As I said when I announced this project, it’ll probably sell for a few dollars on itch.io. I hopefully want to get this done by September – that seems like an acheivable goal given its current state. Then, it’ll have taken me a year to work on this project. I’ll admit it doesn’t feel like a year’s worth of effort, but.. it’s been a weird year for me, for multiple reasons. But I think I can probably do that. I work better with deadlines anyway…