7DRL 2018: Shift Stack

I made a roguelike in seven days! It's called Shift Stack and you can play it on itch.io (in a desktop browser) for free!

I had a lot of fun making this game and I want to go into some aspects of the game I like and some that I don't. I'm going to assume you've played it a little bit, so if you haven't you might want to give it a spin. You don't have to, of course, but it might make more sense to play it and then read this.

About The Game

The main idea I had when I started this game was playing with the idea of "depths" in traditional roguelikes. Generally there are some number of levels you traverse down into, and in some cases you can retrieve something from one of the lower depths and then go back to the first one to win the game. Hoplite worked with this formula very well, and one of my favorite iOS roguelikes, MicRogue (which I can't find an offocial website for, so I'm just linking to the App Store and Google Play Store), used this as its main goal.

The main mechanic of Shift Stack is that you can warp between depths (or levels) pretty much at will. There's a limit to how many times you can do it and yu can only warp to adjacent levels so it's not completely free, but it feels like a worthwhile limitation.

The second mechanic I ended up adding is making the player helpless, so to speak. You can warp levels and move around but otherwise you're powerless. No attacks, no abilities, no spells or anything like that. This ended up happening because I wanted the focus to be the level warping and not just wrangling enemies so you could punch them in the face.

So then how do you win? Rather than collecting a single treasure from one of the levels, your goal is to defeat all the monsters. Since you can't attack them, monsters are more dangerous than a standard roguelike. While you can end up adjacent to one and never get attacked, you can get trapped and since you ony have two health you can only really sacrifice one hit point most of the time.

Things I Like

There are a lot of things I enjoy about the design of the game. I really like the main mechanics and the concept of a stacked set of levels that you can sort of see. I like having a player character who doesn't have any means to directly attack monsters and must use the envirornment to their advantage.

I think the thing I'm overall happiest with is how seamlessly enemies and the player interact with the level's tiles. Enemies will avoid directly walking onto traps in the current level (aside from some edge cases) but can also steal your power-ups.

While Realm of the Ghost King did use an entity-component system, it was never as refined as I wanted and I decided to not revise it in order to actually finish the game. Shift Stack gave me an opportunity to rethink parts of it that I wanted to, so I ended up with very clean entity definitions. Here's the player:

player: {
    width: 16,
    height: 16,
    components: {
        Player: {
            power: 3
        Renderable: {
            size: 12,
            color: "#0000C0",
            sprite: "player",
            shadow: true
        Movable: {
            moveSound: "step"
        Hurtable: {
            health: 2,
            hurtSound: "hurt",
            deathSound: "player_death",
            onDeath: function() {

The only real difference between the player and an enemy is that the player is controlled by input. The "Player" component is a small differentiator but that coule easily be (and maybe should be) a "PowerUser" component that would signify the ability to use the power charger pickups but also give the entity an inventory of power they could use. There's also an "Enemy" component that dictates enemy movement.

The final part to this system is that every tile has a function triggered whenever an entity enters it. Tiles have properties denoting that they can heal, recharge or do damage, so whenever an entity enters a tile one of those things happens (it could also be all three but no tiles in the game have multiple properties).

Things That Need Work

The main issue with the game is I feel like it needs more variety. Once you figure out how it works it just becomes a matter of plotting a course that lets you get rid of all the enemies without running out of health or power. I almost feel like it would be better as a series of authored puzzles rather than a set of randomly generated levels. It could be interesting to play with grid size as well as the number of levels. It also could potentially scratch an itch I have for making something with authored content, so maybe I'll revisit that at some point in the future.

Also due to the design of the game it's easy to get stuck. The game attempts to account for the most obvious case: when you run out of power and there are no charging stations on the current level. However it's also possible to get trapped by enemies with no way out (due to being blocked from warping to the next level). The game does not account for that issue, which is why I added the "Murder Scientist" button, which is a kludgy solution. I could certainly add detection for when the player is trapped, but leaving that out was mostly due to the time constraints. The "Stranded" scenario (running out of power) was only added in the last day and actually introduced a bug where you could beat the game but lose because you used your last teleport to kill the last monster in a level with no power stations.

Final Thoughts

Overall I had a lot of fun and in all honesty being able to submit a mostly finished game was a great boost. Like I said I don't think the final product is perfect, but being able to get something done was awesome!

Release 1.0.5

My continuing series of updates, I released ROTGK 1.0.5 which has some (hopeful) fixes for Linux crashes, the blocked exit bug (not optimistic about this one at all) and a Steam achievement issue as well. Patch notes are on Steam and itch.io as always.

1.0.4, I'm Good At Games

1.0.3 introduced a pretty silly bug, so I wanted to patch it up to 1.0.4 pretty quickly. Hopefully I can lay off breaking my own game for at least a few days now. You can read the full patch notes on the Steam Community page or the itch.io devlog if you prefer.

Patch 1.0.3 + Linux

This one is already making me realize I will need a new patch soon, but I'm sure people don't mind waiting a little.

The main piece of news is the Linux version is finally out. This was slightly more of a struggle than the Mac or Windows versions since I don't have a computer running Linux and I didn't really want to set up an existing one to dual boot. So I installed Vagrant and VirtualBox and all that good stuff and here we are:

It's hard to tell how well it runs since things in a VM generally don't run super well, but it seems to be pretty quick all things considered, so I'd imagine someone running it non-virtually will have a good experience. The DRM-free version is also up on itch.io if that's your preference.

There's also one gameplay related change, which adds visible enemy spawn spots (one turn before they spawn) for all those enemies that teleport in during each map (you can see a screenshot in this Steam update). My main reason for this was sometimes I'd be playing too quickly and run up against a spot where an enemy had just spawned and immediately get hurt or killed. This won't actually prevent that from happening, but it takes away my excuse for why I'm so bad at my own game. Maybe I'll take it out in a couple of weeks when I decide I want that excuse back (I won't).

Some Thoughts About Launching A Game

Woohoo, I launched a game! Someone bought a copy! Success!

Okay so, first thing's first, the launch sale on Steam is over, so the game is full price there. However, since itch.io is a ridiculously awesome platform I decided to extend the launch sale there for another week. So you get the game for 10% off (which, I know, is only 40 cents, but still) plus you still get a Steam key (if you want). Everybody wins there as far as I'm concerned! Also I highly recommend using itch's desktop app which is super fast and will keep your games up to date.

A Game Was Launched (And Patched)!

Weird! It got launched, some people bought it. Most people seem to like it, or at least they think it's hard, which it is. More than two people (not counting myself) seem to be playing the Daily Challenge. It got a nice little mention on IndieGames.com and was subsequently picked up by a French gaming site.

I also patched the game! Not quite zero day but I did want to show my commitment to adding stuff post-launch. Someone was nice enough to give me a "recommended" review on Steam (still the only one) but they mentioned that they didn't like how the HUD overlapped the map. There's not a super elegant solution to this due to how the game is written, but I added a "compact" HUD as a compromise of sorts. I also added Steam achievements, which I would have added much sooner had I known they would be so easy to add. They were one of the things I decided to cut in order to call the game "done" and get it out but they definitely could have been added.

Some Thoughts

Obviously the game hasn't been what one might consider a commercial success. I have managed to make back the Steam submission fee, but I'm not going to be able to quit my job from the earnings. If I can make enough to pay back the submission fee and pay for the next game's fee (whenever that is) that would be pretty cool though. I'm in a fortunate place where I have steady income from my day job and I don't need game sales to pay bills or anything.

From a sales perspective, I didn't really have huge expectations for this game. It's pretty low-fi and doesn't do much to wow you when you see screenshots or even video. That's by design (and necessity) since I did all of the art myself. I think it's cute and mostly well done but I'm certainly not going to win any artistic or pixel art awards. The game itself is also kind of in a weird grey area as a game. It's meant to be a simplified version of very complex rougulikes such as Brogue or ADOM (or uh, Rogue) which theoretically lowers the barrier to entry. However it's still quite difficult so the relief only comes in how long it takes to play a single game. You fail fast, which means you can fail more often, but you still need to learn how everything works and plan ahead a reasonable amount.

I don't know what all that means, it's just kind the way it is. Sometimes you have a goal like "a roguelike with simplified systems and mechanics", thinking that makes it more accessible, but then by necessity you can't get away from the difficulty that comes with those types of games. On top of that, would this game actually be fun if it wasn't difficult? If you spent 10 or 15 minutes creeping through the levels and beat it almost every time you played, that would be pretty boring. What makes roguelikes interesting is that failure is the default. You're going to fuck up and lose all of your progress and that's just the type of games they are. Overcoming failure and escaping against the odds are what I think makes roguelikes appealing to most fans of the genre.

That all said, I could probably sell a few more copies. Reaching an audience is the most difficult thing about selling a game. I emailed a few sites, but only IndieGames.com posted about it. That's fine, since there are a ton of other games to cover and the coverage benefits me much more than them at this point. I'm completely unknown in the gaming space and my connections are pretty sparse. I can (and probably still will) email more sites. I've also targeted a couple of streamers who might enjoy the game, so we'll see where that goes. It's also entirely likely I've sold the majority of copies I'll ever sell, which is fine too. The important part of this process, for me, has been actually finishing and releasing the thing.

What's Next?

There are a couple fairly minor changes I want to make to the game. I don't quite think I want to re-balance the late game, but I do think I want to attempt to add a couple tweaks that might improve quality of life. On a bigger scale I'd like to release a Linux version. It should be fairly easy once I get a VM up and running and can properly test it. I'm also working on a Mac App Store version, which is mostly because I paid the Apple Developer Program fee so I may as well utilize it. It's been a pain to get all the code signing stuff working, but I'll probably get there eventually.

That's it for now; thanks for reading. More updates and blog posts are probably coming. I do eventually want to start on a new game (which probably won't be a turn-based roguelike) but I'm taking a small break for now. I also signed up for the 7 Day Roguelike Challenge (again) which starts on March 2nd. Hopefully I don't spend four years on that one!