So I made a roguelike! I have a problem with roguelikes: the games are incredibly punishing, and usually I can’t bring up the patience to continue playing after five permadeaths or so. Also, these games can be complicated, with very little explanation—something I think is amazing in most games, but can be very frustrating in a roguelike where you’re thrown to the wolves almost instantly.
However, I have been fascinated by the genre, regardless of my inability to actually play the games. So when I saw 7drl was happening this year, I wanted to make a minimalist roguelike, also known as a roguelite. Here’s an overview of the gameplay of the game and how it was put together this way.
Square grids are cool, but I really wanted to try and make a game on a hex grid once. (I also opted to use hexes in Hexaria!) That means I couldn’t use pathfinding, so I’ll have to settle with some “dumber” enemy behavior.
I designed the game to be played with tank controls. By pressing forwards or backwards, you walk into the direction you’re facing into, which you can change by turning around with left or right. This way, you can navigate a hex grid while still needing just four buttons.
Moving forwards or backwards consumes a turn. I was thinking about having turning around also consuming a turn, but I think it would have made the game way too hard to be fun.
HP is a very overdone system in games, and I wanted to try something different. There’s an enemy in one of the top-down Zelda games that is invincible, but does get knocked back a lot when attacked. They’re placed in rooms with pits. Guess what happens next.
This is what I wanted to make an entire game about, and was the first part of the game idea that would ultimately become my 7DRL entry.
Now that the enemy must be pushed off the stage (not unlike a Sudo wrestling match), you can start doing a lot more interesting things with level design. Here’s also where the random world generation (the trademark feature of the rougelike genre) comes in. A dynamic world is something I explored in Edge of the Sky, but while in that game the world constantly grows, in this game the world becomes ever more fragile.
The world starts off as a hexagonal shape, with ~80 hexagonal tiles. Once you progress through the game, some of those solid tiles get replaced by fragile tiles, which break after someone steps on it (either the player or an enemy). If the player reaches the flag, some of those tiles will be filled in. This part of the game was inspired by Pyoro, where your playing field grows or shrinks depending on how well you’re playing.
Slowly, the map turns into a grated cheese. It’s up to the player to prevent this as much as possible by playing carefully. This can be difficult, but they also have advantages, like acting as an extra hole to push enemies through.
If the player has moved and the move is valid, the enemies get their turn. Each enemy type is processed in order, so each enemy of the same type gets their move, and once they’re all done, the next type of enemy is allowed to move.
The copy will face you and walk towards you if you are in their line of sight in front of them. When flanked, they’ll just turn, or if approached from the back, they won’t do anything at all. If they hit you, you get pushed back one square. If you hit them, they’ll go one square back and are stunned, meaning they can’t use their turn after yours to instantly strike back to prevent stalemates.
Since the first enemy is melee only, I wanted a ranged attacker next. The slingshot shoots arrows. It has a three turn cooldown between shooting arrows. If pushed it gets stunned, meaning the cooldown is paused, so it can’t shoot more arrows if it is attacked repeatedly. Arrows have a lifetime of around ten turns, after which they’ll disappear. If they hit the player, they get pushed back two squares.
The sniper was the last enemy to be added. It has the most powerful attack of all enemies, but cannot rotate towards you if it’s unprovoked. Once it spots you, a countdown starts, upon which a laser is fired in the direction of the player. If you’re hit, you get pushed back three squares. This enemy will also rotate towards you if you’re attacking it, meaning it can be hard to deal with in big groups of enemies.
The game is endless, there’s no level goal or credits scene. However, I did manage to put some graphs on the game over screen, tracking the turns taken, enemies defeated, and flags gathered from the last ten runs. This should give you a little idea about if you’re getting better at the game, and in which extent. This is something I wanted to try for a while now to see if it motivates players more than a normal statistics screen, and the first results are good so far, so I might use this method of indicating progression in future games.
I really wanted this game to be accessible for a lot of different player types (like my precision platformer Mobility!), but I did not manage to include all features I had planned for that, such as a setting to turn permadeath off, a difficulty selector, or a way to input a randomness seed. Features that did make it in include the fact that the game has no text (in stark contrast to most rougelikes), the fact that you can play the game with the arrow keys, WASD, ZQSD and a controller, and the fact that the game has no randomness except for the level generation. The “textless” restriction also prompted me to use a hexagon symbol (⬣) as name for the game. (Hexagone was a close second, but fell through when I found out that was already the name for a French swimming pool appliance manufacturer.)
The game starts with a controls tutorial, then introduces all enemies until you hit level 7, after which more enemies keep spawning and the world becomes more fragile. The highest score I had was around 12 flags, but Unidrax managed to hit 22 flags!
I like isometric perspectives drawn really low-fi. I figured out quickly that staring at a static hexagon grid is pretty boring, so it needed some life implanted into it.
First, I made the grid tiles wiggle up and down a bit. This is not very noticeable—the effect used to be more intense, but I dialed it back a ton to prevent it from becoming too distracting.
There are a lot of things around the platform that float as well—I finally figured out how to set a sinus up correctly to do get a “float” effect. The background used to be the same pure black color as the tiles, but it could pretty hard to see if a tile was gone if the colors where the same.
The game has a lot of visual effects, like enemies and tiles spawning in, tiles being blown out or falling down, slashing animations, lasers, and of course screenshake. All of this is to help the player understand how the game works, and give them appropiate feedback. Especially the tile generation animation, which plays when you’re at a goal tile, takes a bit of time (although that’s also to prevent the game from breaking when that happens too fast!)
Here are the steps I took to get audio into this game, or my guide on how to do audio design when time is of the essence:
1) Find a nice track in the Free Music Archive that’s in the CC-BY and fits well with your theme, then include it in your game, put it in the credits, and set it to loop at the start of the game.
2) Find a couple of nice sound effects on freesound.org that are in the public domain (so you don’t have to credit them). You do need an account to download sounds, so I recommend setting that up in advance. Here is a list of words that might be useful to know. I always sort with the shortest sounds first. Try to find a large bundle with the kind of sounds you’re looking for.
3) Put the sounds in Audacity for quick maintenance (trim away silent parts or parts of the sound you don’t need).
4) Put all sounds in the game, and assign them to the correct actions. Also set a pitch for when the sound effect plays. If it’s a sound you hear often, randomly select the pitch from a range. If multiple entities can play the sound (like the player and the enemy), set the same sound effect, but with a different pitch for both.)
5) Play the game, and tone down the volume or pitch of sounds you think are too dominant in the soundscape (especially if you hear them often). Play the game for a bit and watch for bits where a certain sound effect gets tiring, or places where you an audio cue is still missing.
This became a long post! Mostly, I’m just really happy I managed to make such a strategically interesting game within such a short time. I was able to try out a lot of ideas I had that happened to work really well together. This is also my first step into rougelike territory with emergent gameplay and random worlds, and it might be something I’ll explore another time as well.
You can play ⬣ on itch.io.