Adam Rumpf: Math Person

Cellular Arcana

A roguelike dungeon crawler with cellular automata-based magic. (This project is currently in development but you can check out the public alpha at its itch.io page.)

This is a roguelike dungeon crawler where you play as a wizard with a dumb name and inconvenient spells. Your spells are based on cellular automata (CA), a type of mathematical model where cells in a grid interact with their neighboring cells to give rise to complex emergent behavior (the most famous example being Conway's Game of Life).

This project is still in development and currently consists of little more than a tech demo for the CA-based spell system. I may periodically update it over time to get it to the point of being a full-fledged game. Or not. We'll see.

Screenshots

7DRL Challenge

I began working on this project as part of an intended submission for 7 Day Roguelike (7DRL) Challenge 2021. Due perhaps in part to most of my previous experiences with roguelikes being action-based, my preliminary ideas revolved around developing interesting procedural generation systems for action game weapons based on metaheuristic optimization techniques. I would still like to play around with those ideas at some point, but I felt like it would be more in the spirit of the jam to try to hew closer to the classic roguelike style. That got me to thinking about a turn- and tile-based game, and eventually to the idea of using cellular automata (a topic with which I have some level of familiarity) for gameplay purposes. Thinking about "classic" roguelikes is also what motivated me to go for a fantasy dungeon crawling setting (along of course with my love of D&D).

Making the player into a wizard, and making their spells behave like a CA, seemed to be the natural way to incorporate CA into a roguelike. My initial ideas for procedural spell generation were significantly more complicated and involved more effort on the part of the player to control the behavior of their spell. For simplicity I decided to just pick the CA at random from a list of rules that I had generated beforehand by writing a program to search for ones likely to lead to "interesting" patterns. As a result the gameplay tends to be rather unbalanced from run-to-run since some patterns are far more useful than others, and with lifelike CA it can be pretty easy to get yourself killed, but that's funny so I decided to roll with it. In fact, one of my favorite fantasy games is Magicka, which does an excellent job of making its magic system feel dangerous and powerful due to how easily you can accidentally kill yourself with your own spells. I really enjoy works that portray wizards as irresponsible doofuses, which is also what led me to spend so much time working on a random generation system for creating dumb wizard names.

Unfortunately I wasn't able to get much visible done by the end of the jam period. What I had finished was essentially a turn-based board game engine where you could create pretty patterns made out of a crude fire sprite. I really should have learned since my last jam entry to stop spending so much time on complicated underlying systems that the player never actually sees. Although it seems like just getting pieces to move around a board would be easy, the fact that I wanted to animate their movement, to implement enemy pathfinding, and to handle several different CA systems simultaneously required a surprising amount of groundwork to be laid before I could actually get to the gameplay part.

The pathfinding issue turned out to be one of the biggest stumbling blocks during the jam period, and was one of the things that ended up eating the most time. As a semi-professional graph lad, when presented with the task of figuring out how to get enemies on a game board to find the shortest path to the player, the first thing that occurs to me is Dijkstra's algorithm. My original plan was to maintain a graph representation of the game board and to use that for finding shortest paths, and I even made a GMS2 local asset package for it, but that turned out to be far too computationally expensive on a board with hundreds of spaces. Having sunk a couple of days worth of development time into it, I eventually abandoned that system for a lightweight implementation of A* search that uses only an array representation of the board while keeping the graph structures implicit, and making the switch dramtically improved the time required to compute enemy moves.

The enemy pathfinding algorithm also resulted in some interesting unexpected behavior. Cellular Arcana allows diagonal movement (since disallowing it makes the entire game feel much slower), meaning that distances on the board are measured as Chebyshev distance. Under this metric moving diagonally counts as exactly the same distance as moving rectilinearly, unlike Euclidean Distance where diagonal movement takes longer. As a result, if the player is located on the same rank or file as an enemy, the enemy often takes a circuitous-looking zig-zagging route to move closer to the player, since under Chebyshev distance that takes no longer than a straight path. I like the result since it makes it seem like the enemies are attempting to avoid a direct line of sight to the player as if to dodge the player's attacks, even though that isn't something they've actually been programmed to do (yet).

By the end of the 7-day jam period I had only really gotten the movement system, melee attacks, and a few spell patterns in place, along with placeholder art for most of the game's elements. I could have perhaps gotten it to a somewhat playable state with a little more time, but it would not have gotten anywhere near my original plans for the dungeon exploration and the spell development. Rather than releasing a half-finished project I decided to shelve it.

That is, until...

Early Access

... I decided to still leave it mostly on the shelf, but to occasionally poke and prod it and also to let other people in because hey I put a lot of work into that shelf.

Previously I've preferred to keep all of my projects private until they're done to my level of satisfaction, but not too long after the 7DRL jam ended I started a new career. With all of the preparation required for the position I knew that I would not have much time to work on game design projects for another year or so, and I certainly didn't like the prospect of going so long without releasing something, so I decided to continue to work on Cellular Arcana off-and-on as an early access game.

As of the initial public alpha release the project has achieved what I would consider to be a bare minimum of what is required to constitute a gameplay demo, including completing the artwork, adding sound, and implementing a rudimentary room battle progression system to allow for endless mode. The eventual plan is to flesh out the game by adding different areas, shops, more enemies, and an actual ending, as well as differentiating the different spell elements (which currently differ only cosmetically), though I cannot say for certain whether any of that will ever happen. I will still certainly continue to release games in the future, but I may well have lost interest in this particular project and moved on to something else by the time I'm able to finally work on it.

I have to say that this game includes the best pixel art I've ever made. Working within a 16x16 pixel square forces you to adopt a stylized approach in order for anything to be recognizable. For example, trying to draw a realistically-proportioned adult humanoid in that little space would make their limbs about 1 pixel wide, which would make all humanoid characters look nearly identical. But giving every character a huge head that takes up half of the square grants much more space in which to add distinguishing details.