7 Day Roguelike Challenge 2019 — Six sides of the same hex

March 13, 2019

So I made a rogue­like! I have a prob­lem with rogue­likes: the games are incred­i­bly pun­ish­ing, and usu­al­ly I can’t bring up the patience to con­tin­ue play­ing after five per­madeaths or so. Also, these games can be com­pli­cat­ed, with very lit­tle explanation—something I think is amaz­ing in most games, but can be very frus­trat­ing in a rogue­like where you’re thrown to the wolves almost instantly.

How­ev­er, I have been fas­ci­nat­ed by the genre, regard­less of my inabil­i­ty to actu­al­ly play the games. So when I saw 7drl was hap­pen­ing this year, I want­ed to make a min­i­mal­ist rogue­like, also known as a roguelite. Here’s an overview of the game­play of the game and how it was put togeth­er this way.

Hexagons

Square grids are cool, but I real­ly want­ed to try and make a game on a hex grid once. (I also opt­ed to use hex­es in Hexa­ria!) That means I could­n’t use pathfind­ing, so I’ll have to set­tle with some “dumb­er” ene­my behavior.

I designed the game to be played with tank con­trols. By press­ing for­wards or back­wards, you walk into the direc­tion you’re fac­ing into, which you can change by turn­ing around with left or right. This way, you can nav­i­gate a hex grid while still need­ing just four buttons.

Mov­ing for­wards or back­wards con­sumes a turn. I was think­ing about hav­ing turn­ing around also con­sum­ing a turn, but I think it would have made the game way too hard to be fun.

Pushing

HP is a very over­done sys­tem in games, and I want­ed to try some­thing dif­fer­ent. There’s an ene­my in one of the top-down Zel­da games that is invin­ci­ble, but does get knocked back a lot when attacked. They’re placed in rooms with pits. Guess what hap­pens next.

This is what I want­ed to make an entire game about, and was the first part of the game idea that would ulti­mate­ly become my 7DRL entry.

A fragile world

Now that the ene­my must be pushed off the stage (not unlike a Sudo wrestling match), you can start doing a lot more inter­est­ing things with lev­el design. Here’s also where the ran­dom world gen­er­a­tion (the trade­mark fea­ture of the rouge­like genre) comes in. A dynam­ic world is some­thing I explored in Edge of the Sky, but while in that game the world con­stant­ly grows, in this game the world becomes ever more fragile.

The world starts off as a hexag­o­nal shape, with ~80 hexag­o­nal tiles. Once you progress through the game, some of those sol­id tiles get replaced by frag­ile tiles, which break after some­one steps on it (either the play­er or an ene­my). If the play­er reach­es the flag, some of those tiles will be filled in. This part of the game was inspired by Pyoro, where your play­ing field grows or shrinks depend­ing on how well you’re playing.

Slow­ly, the map turns into a grat­ed cheese. It’s up to the play­er to pre­vent this as much as pos­si­ble by play­ing care­ful­ly. This can be dif­fi­cult, but they also have advan­tages, like act­ing as an extra hole to push ene­mies through.

Enemies

If the play­er has moved and the move is valid, the ene­mies get their turn. Each ene­my type is processed in order, so each ene­my of the same type gets their move, and once they’re all done, the next type of ene­my 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 any­thing 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, mean­ing they can’t use their turn after yours to instant­ly strike back to pre­vent stalemates.

Since the first ene­my is melee only, I want­ed a ranged attack­er next. The sling­shot shoots arrows. It has a three turn cooldown between shoot­ing arrows. If pushed it gets stunned, mean­ing the cooldown is paused, so it can’t shoot more arrows if it is attacked repeat­ed­ly. Arrows have a life­time of around ten turns, after which they’ll dis­ap­pear. If they hit the play­er, they get pushed back two squares.

The sniper was the last ene­my to be added. It has the most pow­er­ful attack of all ene­mies, but can­not rotate towards you if it’s unpro­voked. Once it spots you, a count­down starts, upon which a laser is fired in the direc­tion of the play­er. If you’re hit, you get pushed back three squares. This ene­my will also rotate towards you if you’re attack­ing it, mean­ing it can be hard to deal with in big groups of enemies.

Progression

The game is end­less, there’s no lev­el goal or cred­its scene. How­ev­er, I did man­age to put some graphs on the game over screen, track­ing the turns tak­en, ene­mies defeat­ed, and flags gath­ered from the last ten runs. This should give you a lit­tle idea about if you’re get­ting bet­ter at the game, and in which extent. This is some­thing I want­ed to try for a while now to see if it moti­vates play­ers more than a nor­mal sta­tis­tics screen, and the first results are good so far, so I might use this method of indi­cat­ing pro­gres­sion in future games.

I real­ly want­ed this game to be acces­si­ble for a lot of dif­fer­ent play­er types (like my pre­ci­sion plat­former Mobil­i­ty!), but I did not man­age to include all fea­tures I had planned for that, such as a set­ting to turn per­madeath off, a dif­fi­cul­ty selec­tor, or a way to input a ran­dom­ness seed. Fea­tures that did make it in include the fact that the game has no text (in stark con­trast to most rouge­likes), the fact that you can play the game with the arrow keys, WASD, ZQSD and a con­troller, and the fact that the game has no ran­dom­ness except for the lev­el gen­er­a­tion. The “text­less” restric­tion also prompt­ed me to use a hexa­gon sym­bol (⬣) as name for the game. (Hexa­gone was a close sec­ond, but fell through when I found out that was already the name for a French swim­ming pool appli­ance manufacturer.)

The game starts with a con­trols tuto­r­i­al, then intro­duces all ene­mies until you hit lev­el 7, after which more ene­mies keep spawn­ing and the world becomes more frag­ile. The high­est score I had was around 12 flags, but Unidrax man­aged to hit 22 flags!

Graphics & Audio

I like iso­met­ric per­spec­tives drawn real­ly low-fi. I fig­ured out quick­ly that star­ing at a sta­t­ic hexa­gon grid is pret­ty bor­ing, so it need­ed some life implant­ed into it.

First, I made the grid tiles wig­gle 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 pre­vent it from becom­ing too distracting.

There are a lot of things around the plat­form that float as well—I final­ly fig­ured out how to set a sinus up cor­rect­ly to do get a “float” effect. The back­ground used to be the same pure black col­or as the tiles, but it could pret­ty hard to see if a tile was gone if the col­ors where the same.

The game has a lot of visu­al effects, like ene­mies and tiles spawn­ing in, tiles being blown out or falling down, slash­ing ani­ma­tions, lasers, and of course screen­shake. All of this is to help the play­er under­stand how the game works, and give them appropi­ate feed­back. Espe­cial­ly the tile gen­er­a­tion ani­ma­tion, which plays when you’re at a goal tile, takes a bit of time (although that’s also to pre­vent the game from break­ing when that hap­pens 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 cred­its, and set it to loop at the start of the game.

2) Find a cou­ple of nice sound effects on freesound.org that are in the pub­lic domain (so you don’t have to cred­it them). You do need an account to down­load sounds, so I rec­om­mend set­ting that up in advance. Here is a list of words that might be use­ful to know. I always sort with the short­est sounds first. Try to find a large bun­dle with the kind of sounds you’re look­ing for.

3) Put the sounds in Audac­i­ty for quick main­te­nance (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 cor­rect actions. Also set a pitch for when the sound effect plays. If it’s a sound you hear often, ran­dom­ly select the pitch from a range. If mul­ti­ple enti­ties can play the sound (like the play­er and the ene­my), set the same sound effect, but with a dif­fer­ent pitch for both.)

5) Play the game, and tone down the vol­ume or pitch of sounds you think are too dom­i­nant in the sound­scape (espe­cial­ly if you hear them often). Play the game for a bit and watch for bits where a cer­tain sound effect gets tir­ing, or places where you an audio cue is still missing.

Conclusion

This became a long post! Most­ly, I’m just real­ly hap­py I man­aged to make such a strate­gi­cal­ly inter­est­ing game with­in such a short time. I was able to try out a lot of ideas I had that hap­pened to work real­ly well togeth­er. This is also my first step into rouge­like ter­ri­to­ry with emer­gent game­play and ran­dom worlds, and it might be some­thing I’ll explore anoth­er time as well.

You can play ⬣ on itch.io.