• The blog has a new home

    I’ve started blogging at blog.steveasleep.com, hosted on write.as. I expect to keep the blog there going forward. This site runs on Pelican, which is great for making static sites, but I’ve been doing a much better job of writing consistently now that I can do it all from a web browser.

    New blog

    RSS feed

    Old blog

    Posts so far

    Read →

  • PCG32: The Perfect PRNG for Roguelikes

    Hello, Hacker News. You found a post I wrote in 2018 that in hindsight has some issues. Please don’t judge me too harshly. Instead, check out my free online whiteboard Browserboard or read some of my newer posts, such as Let’s generate some imaginary guitar pedals.

    Roguelikes are games that, among other things, have a lot of procedurally generated content. To generate content, we need random numbers. And to get random numbers, we need a pseudo-random number generator.

    Not only do we want random numbers, but we want predictable random numbers! We want players to be able to share seeds and see who does better in the same situation, while also giving people a completely fresh experience every time they play.

    We can’t just create a PRNG with a seed and be done. If we use the same PRNG for both level generation and combat, for example, then our second level might change based on how many times the player got into a fight!

    So we need to be clever about how we create and store our PRNGs, to ensure that the procedurally generated maps are not affected by anything that happens during gameplay.

    If we use …

    Read →

  • 2017 Year in Review

    This year I did a bunch of things, but one thing I didn’t do was blog about every single thing. Here’s a roundup of everything I missed.

    I made some games

    I made three games this year for Ludum Dare 38, 39, and 40: Rogue Basement, Power-Q, and Please, Come In. Their collective soundtracks contain five original songs.

    The only one I really dedicated myself to during Ludum Dare was Rogue Basement, and it shows in the ratings. The other two were experiments with frameworks and genres. But I did polish Power-Q for an iOS release, and you can get it now!

    It feels good to hit a new personal best in game releases, because it means I’m more motivated than ever to take my coding to creative places. And the consistent quality of each game demonstrates how much I’ve learned about game design over time. Rogue Basement and Power-Q eclipse all ~15 other games I’ve ever made in terms of fun and polish.

    I wrote some open source libraries

    Early in the year, I was looking into ways to manage a local music collection and make playback control available to everyone on my home …

    Read →

  • From PoweRL to Power-Q: game jam to product

    Power-Q is the polished, productized version of my Ludum Dare game PoweRL. They have exactly the same mechanics, but Power-Q has about 30 extra hours of effort invested into it. Before I send it out into the world, I want to reflect upon where those 30 hours went.

    Power-Q is in beta on Mac and iOS. You can get the Mac beta on itch.io, but to get the iOS beta you’ll have to email me.




    Game mechanics

    Power-Q is a turn-based game played on an 8-column, 6-row grid. The player is a robot with a health bar and a power meter. They can move up, down, left, or right. Each move drains power.

    The level contains walls, enemies, powerups, and an exit. The overall goal of the game is to reach the exit 8 times. Each level has more enemies than the last. Powerups include health boosts, power boosts, and ammunition.

    There are three kinds of enemies. They move in specific patterns (diagonals, up/down/left/right every other turn, and knight-style) and sap your health when they hit you. There are also “power drains,” which sap your power and disappear if you run over them …

    Read →

  • PoweRL postmortem

    Ludum Dare 39 fell on a weekend when I wasn’t busy, and I wanted an excuse to learn a bit about Apple’s game libraries, so I made another roguelike, PoweRL:


    I wasn’t in the mood for stress, so I set my standards very, very low. Ironically, the result is more commercially viable than most of what I make! That might not be apparent from the screenshot, but maybe this new version with updated art will convince you:

    Screenshot 2

    Swift, SpriteKit, and GameplayKit

    iOS engineer” is part of my normal job description, but in the past I’ve avoided using Swift or Objective-C for jams because it isn’t cross-platform. But since I didn’t really care about the outcome of this jam, I let my curiosity about SpriteKit and GameplayKit win out over portability.

    I’m really glad I did, because after learning the frameworks, I spent almost no time worrying about the engine! My last Ludum Dare game, Rogue Basement, needed a lot of up-front work on the engine to get running, and then optimization work after completion. But with PoweRL, SpriteKit made for an efficient renderer and animation system, and GameplayKit gave me structure for gameplay …

    Read →

  • Videos of old games

    I spent the day making some basic playthrough videos of some of my old games. Check ‘em out! You can find more info about them here.

    Most of these videos have some kind of disruptive sound.

    Bibble Biter (2005)

    Walaga (2005)

    Canvas Wars 2 (2005?, unfinished)

    There was a Canvas Wars 1, but the code is long gone.

    Whizbang (2005, unfinished)

    Artack (2006)

    You can actually download this one!

    Guy who catches on fire (2007?, demo)

    Tormegra (2007, unfinished)

    Elite Bungie Chopper Squadron (2008)

    Read →

  • The Design and Implementation of Rogue Basement

    This year I participated in Ludum Dare 38, a 48-hour game programming “competition.” I’ve been thinking about trying my hand at a roguelike for a while now, and it seemed like the perfect opportunity to give it a shot. I made Rogue Basement, a bare-bones, single-level game with ASCII graphics.

    In this article, I’ll cover the game design decisions I made, how they affect the player’s experience, and a bit of how they’re implemented. The source code is extensively commented as well.


    What is a roguelike?

    A “roguelike” is a game that is “like Rogue,” a text-based game from the 1980s that looks like this:


    Typical features of these games include:

    • Procedurally generated levels
    • Permadeath (one life)
    • Turn-based action
    • Top-down 2D graphics, often just text
    • Simulation-oriented; interesting stories arise from the game’s rules and behavior
    • Very difficult to win without lots of practice

    The combination of these features makes the games fun to play over and over again. You have to play a lot to get good, but since the game is procedurally generated, you’re always facing new situations. You have to use your wits to survive.


    I started on Friday night with …

    Read →

  • Home audio with OS X and cheap consumer electronics

    The switch

    Read →

  • Blogging about iOS architecture at Hipmunk

    I wrote about the work I’ve been doing at Hipmunk over the past year over on over at the Hipmunk engineering blog.

    Read →

  • Sometimes they call me Slam Jamsen

    Salvage Operation EP album art

    Graffiti Labs is shutting down next month. I’ll be spending June looking for a new job (edit: found one!) and honing my audio engineering skills.

    As my first act of freedom, I’m releasing Slam Jamsen’s Salvage Operation EP!

    This is a collection of “bedroom tapes” made between 2005 and 2009. The popular vision of a budding high school rock musician is a guitarist sitting on a bed writing bad love songs, but in my case, I was at a desk with a low-end Mac and a MIDI keyboard, sharing the room with two more computers and a treadmill, writing bad video game soundtracks.

    Since the rise of the 4-track, the cost of making decent home recordings has fallen at different rates for different genres. As a so-so piano student and early-to-mid-‘00s Mac user, my options were limited at first to MIDI editors. When Apple’s Garageband program came out, and I finally got a copy, I discovered the world of software synthesizers.

    Video game development was my other major hobby at the time, so it seemed obvious that I should write my own soundtracks. (Otherwise, I wouldn’t have soundtracks at all, given my $0 budget …

    Read →

  • I played drums on this EP

    The Nest EP album art

    My band The Nest just put out its first EP. Listen to it here!

    Read →

  • I played bass on this album

    Clarity in Hindsight album art

    I just returned from recording an album with SF local artist Anthony Presti. Check it out on Bandcamp!

    Read →

  • The New Dork Times

    I did the best writing of my life in 1997 when I was eight years old, sitting at an old PC with my friend Eric Drury to write the New Dork Times. Although it ran for only nine issues published between 1997 and 1999, its biting social commentary remains as relevant as ever.

    Earlier this year I came across my personal archives of all nine issues of the New Dork Times and decided they were worth two hours of attention to bring to a modern digital audience. I now present to you an online time capsule from 16 years ago, lovingly typeset in its original Times New Roman:

    The New Dork Times – Digital Edition

    Read →

  • We Dreamers postmortem

    We Dreamers is an abstract online sandbox that placed sixth in the Innovation category of Ludum Dare 26.

    Screenshot of We Dreamers

    You can play it here. (Ludum Dare page) It may take a while for the 4+ MB of user data to download, so give it a minute or two. Here’s ten seconds of it:

    Of all my programming escapades over the past couple of years, I’m most proud of this one. Here’s a comprehensive collection of my thoughts about it, including a discussions of the technical aspects.


    During the final voting round for Ludum Dare 26, I spent a couple of hours coming up with good ideas for every possible theme…except minimalism. No way that would get through, right?

    When that theme was chosen, and I had to throw out all of my wonderful schemes, most of which were single player pseudo-roguelikes. Instead, I picked a vague idea: a web-based multiplayer world where you dig out rooms underground in a grid. Maybe there would be shapes and colors and stuff. Genius! I figured out the rest as I went along.

    You can do a few things:

    1. Move with the arrow keys or WASD.
    2. Harvest color with space …

    Read →

  • Rendering Buildy’s satellite view: PhantomJS, Beanstalkd, Leaflet, and PIL

    Screenshot of Buildy

    A world in Buildy can be hundreds of square miles. I wrote about the combination of technologies we use to render and display enormous zoomed out world views on the Buildy Blog.

    Read →

  • One thousand users put 250,000 objects in Buildy in 18 hours

    Screenshot of Buildy

    We posted Buildy on Hacker News and it was on the front page for 17 hours. I shared some observations and experiences on the Buildy Blog.

    Read →

  • Space Train Postmortem

    Space Train logo

    With the end of a semester just past, my course projects are all bubbling up in various states of completion. One of these is a point-and-click adventure game called Space Train: Terror on the Mustachio Express, developed by a team of students from the Cleveland Institute of Art and Case Western Reserve University. Its technical components include an event-driven level scripting system, characters, items, inventory, dialogue, and more. The engine is written in Python using my game programming weapon of choice, the pyglet library. The plot:

    Inga Borga is a poetry-loving senior citizen. One of her favorite authors, Stanislov Slavinsky, is reading his poetry live on the nearby Planet Deux, a short hop by space train from Inga’s home. She wants nothing more than to see Stanislav in person, so she catches the Mustachio Express to Planet Deux. Little does she know it will be a bumpy ride…

    Sounds grand, right? We thought so too, but in typical student fashion we failed to account for one thing: adventure games take a lot of work to make. As a result, the game is only about twenty minutes long. Even so, we all learned from the experience.

    The Course

    EECS 390 …

    Read →