A mixture of two genres – a Roguelike and a Tetris-style game – based on a prototype I made with a friend (@ollie_read) in 8 hours during a "Crafts and Gin" Game Jam back in 2012.
• 10 levels
• Procedural generation
• Old-school gameplay
• But actually winnable though
Arrow keys to move/rotate/drop blocks, X + arrows to move rogue and fight monsters.
Full instructions can be found in game. I hope you enjoy it.
This version of the game took a long time to make – more than 40 coding sessions during evenings/weekends of July-November 2017. I had the core game fully working within a few sessions, and the rest has literally been set dressing and "polish" (it still looks like programmer art!). Presentation is quite pompous in places, e.g. a full menu system; this is simply because I wanted to make the game as "finished" as possible (I teach game dev so I want to set a good example).
In order to fit the standard 10x20 grid (plus 4 invisible rows for spawning blocks) on the screen, I had to use 6x6 pixel sprites for each cell rather than the easier option of a map of 8x8 pixel cells. Making clear pixel art in 6x6 tiles is hard, but I’m quite happy with the monster designs and animations – I think they have personality.
This was my first Pico-8 / Lua game so wasn’t sure how restrictive the CPU or token/char count would be in practice. I was worried it would struggle with drawing so many sprites but seems okay? (stat() was showing about 10% CPU at worst). Token budget was more than enough too, but I only realised this once I had carefully implemented most of the critical content – so in general the code is unnecessarily dense. I was disappointed at first that it would easily fit into the restrictions, but then I noticed that I’d gone well over the limit for the compressed .p8.png format, which added a nice little challenge towards the end. Had two runs at crunching - the first involved me hard-coding a load of values and adding short function references, but this meant that I would have to retest the entire game thoroughly to check I hadn't broken anything, so instead I rolled back and just minimised the comments :)
A warning for beginners: Tetris clones might seem like an ideal "basic" project to work on, but I found there are lots of unforeseeable logic problems/exceptions, and quite a few subtle UX tricks that you have to do to make the game "feel" right (some I've done, some I haven't). So beware, I guess.
I’ve got it so the music is in sync with the GFX, but I have had to implement procedural music in order to do this. Originally I had a song that I played at a set tempo and synced up with the monsters "dancing", but if the Pico-8 loses focus (e.g. to desktop) the audio continues to play while the GFX freezes, so the music goes out of sync. Also noticed that pausing and unpausing the game seemed to cause the Pico-8 to throw the sync out by 2 ticks. In the end I created separate instruments as SFX and made my own "song" by triggering them on certain ticks. It’s no accident that the game follows a 12-bar blues pattern; finally my GCSE music lessons paid off.
With so much RNG it was hard to balance, especially while preserving the luck-factor of a roguelike. This meant that I had to complete several runs each time I changed something, to allow for fluctuations in RNG. The longer I've worked on it, the more I've lost all objective sense of how difficult it is, but it is definitely winnable. I hope you guys enjoy it anyway; do let me know how you get on.
WWWWWOOOOW this is REALLY good
i managed to reach 10 in a few plays,
but died from filling up
i basically managed to get through each level by ignoring monters completely. floor 10 was fast enough so you need to clear some monsters up.
mostly i avoided fights cause youll always be underleveled by a lot and fighting is not super affordable
seems pretty balanced overall btw
NOW I GO GET THIS FUCKIN AMULET
RAELLY NICE GAME
@frescogusto Haha thanks! Glad you like it :)
Avoiding monsters is a totally legit strategy, though not something I tested much. The challenge there is that the monsters become very dangerous so you have to be more accurate but still quick. If you're good at making lines and have a good run it's possible to actually get ahead of the monsters - this is normally what I rely on.
Hope you see the end. I made sure it was achieveable after a little practice because there's so much hot shit to play on this bbs every day that I only have a narrow window.
Thanks for the feedback :)
really, really good, an instant classic!
I can relate on the tetris part ;) but you should really fix the square rotation. wall kicks would be a nice addition but it's not a deal breaker (we're spoiled nowadays).
I'm at odds with the fighting system. Since there's already the tetris mechanic, maybe it could be simplified a little or made more obvious? how do you know the monsters level? hearts + shields seem redundant to me. Maybe just hearts would be enough? I can't really "calculate" what I'm up against. I just attack and at some point I die. or maybe it's just me, but I had no problem with Desktop Dungeon or DungeonUp, for instance.
I have no idea what some potions do (luck,echo...). I know It's undocumented on purpose, but I didn't notice any feedback so I really have no clue...
on user interface:
I often end up skimming through the menus right after dying (attacking, thus already pressing x) so you should wait till btn x is false before you start polling btnp x (*)
suggestion on help screen: have left/right arrow to navigate, x to exit
about attacking: "you will always win etc..." is not clear, I clearly died while attacking. I got it, but I had to re-read that part several times. I think it could be re-phrased better (that's related to my attacking issues above though).
all in all, really good, I could buy a hd version on steam!
(*) side note, I wish we had an option in the API to disable the btnp repeat (it's like a quickshot II turbo with auto-fire always on for old geezers like me)
@ultrabrite this is really good feedback, thanks for playing.
Tetris stuff: I don't like that the square rotates weirdly, and code wise this is similar to a wall kick so 2 birds 1 stone. The tetris part was some of the first code I implemented so it's really tight - even the fact that the "stick" is 4x1 required a special case. I'm at the character limit but if I do a significant update I'll try to fix the square at least.
Combat stuff: the hearts/shields thing came from an idea in the prototype that hearts were one-offs but shields can be picked up and lost. Not the case here but kept in for legacy reasons and tried to mitigate by having an enemy type that goes straight for the heart, but agree that it can feel a bit redundant for the most part. I experimented with a few layouts for the hud with this, in conjunction with the level system, though this was the most "readable" I could get it without going pixel-pushing mad. Maybe the mechanic itself is unreadable so the hud is on the back foot to begin with? Confusing but at least has a happy side effect that it adds to the tension ;)
Desktop dungeons is ace! I loved the alpha more than the final version, and it certainly influenced this game a bit. The potions in Rogueris are all 4 letters but I recently considered doing my own variant of IAMAWAL etc :)
Potions can sometimes be beneficial to the player, not the rogue...
Btnp() and "always win": good points, will add to the list.
Left/right on menus: this was the plan before, but until recently I had an options screen that used left/right so the UX would have been inconsistent. Have removed that menu now though, so your point is valid, will add to the list.
Mine was a Cheetah 125+ ;)
Thanks again for the really helpful feedback!
@freds72 Thanks! The compressed limit was actually much tighter than the tokens, which surprised me. I still had a few tricks up my sleeve - though thankfully I didn't have to start hardcoding constants and shortening variable names, as this would have made the code impenetrable going forward...
@freds72 Will check this out - thanks :)
@enargy Good call! Actually for about 90% of the dev time on RogueRis the controls were exactly like this: ESDF for blocks and arrow keys for the rogue. This was also how it was in the prototype, which allowed some really good couch co-op and frantic communication. However, I changed it really late on in the project for a couple of reasons:
1) The default Pico-8 controls are ESDF, rather than the far more natural WASD, so I felt that before people even started playing they would be uncomfortable with the controls, and it would take unnecessary explaining/justification. I tried editing the JS wrapper to override the default ESDF controls with WASD and this worked but didn't cancel out the Pico-8 defaults, so for example pressing S would move both down AND left. In my original post I said that a LOT of time was spent on polish etc - this is the kind of thing I meant. ESDF would cause too many people to ask "why" so I had to think of an alternative.
2) The WASD + arrows setup kind of assumes the player is using a keyboard - It seems quite a few users have gamepads, bespoke hardware etc (or at least I wouldn't want to exclude those people), so it would cause even more awkward controller scenarios if I used it. For me the "true" Pico-8 experience ignores the features of the PC running it and maybe acts more like an arcade cabinet.
Anyway thank you for playing and for taking the time with the mod - it definitely nails the control scheme I was aiming for, but couldn't implement on Pico-8. If I had one criticism, it seems that the ESDF controls stop working after the first block in the webplayer? Haven't had time to check the cart version (am running a Game Jam this week!)
Log in to post a comment