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() {
                App.Game.setGameState('gameover');
            }
        }
    }
}

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!

«
»