Hermes – A Textboard

Internetless in London

Something strange happens when you’re suddenly disconnected from the Internet for a long period of time: You find other things to do. After cleaning the bathroom and tidying my room twice, beating some video games on my backlog, and somehow losing offline access to Spotify (thanks Spotify), it was time for something useful. It was time to watch a lot of Japanese drama.

I’d already watched Densha Otoko before, but I remembered it being a particularly fun romantic romp, incorporating Japanese internet culture into the plot as a major driving force. Amazingly, it’s based on a true story. Well, as true as a story from the Internet can be. The plot revolves a nerd called Yamada, who is far more comfortable in the company of his excessive collection of anime figures than around people. One fateful evening on the way back from an otaku themed event, Yamada encounters a young woman being harassed by a drunk passenger. Mustering all of his courage, he steps in and promptly gets beaten up by the drunk. Fortunately, help arrives and Yamada is saved. The young woman asks for Yamada’s address so she can send him a thank you present.

Once home, Yamada leaps on to his favourite Internet textboard, Aladdin Channel, and writes a post describing his experience and asking for advice. The plot continues with Yamada, dubbed the Train Man (Densha Otoko) by the textboard, putting Aladdin Channel’s advice into action, and attempting to win the woman’s heart.

While watching the show, I figured I could do something productive at the same time. Hermes is my first attempt at a proper, fully-featured Django application. Of course, Hermes is a textboard.

 What’s a textboard?

If you’ve ever been on an Internet forum, you’re already familiar with a different version of the textboard. Textboards are piece of software that allow an administrator to create a number of boards, on which users can post threads and replies to those threads. The biggest textboard out there is 2channel (NSFW), on which the original ‘real life’ Densha Otoko story was posted. It boasts over 600 boards covering a huge range of topics, and a healthy user base.

With textboards, there are two main differences from your standard forum software:

  • Users do not need to register to use a textboard. Indeed, registration likely is not an option at all. Users post either anonymously or with a nickname they provide. These nicknames are not secured in any way, meaning any user could take any nickname. Users who want their posts to be attributed to them and only them can post with a tripcode, a secret password known only to them that generates a hash that is attached to their posts.
  • The content of the first post of each thread is shown on the board page, as well as the content of the latest three or four posts in that thread. This differs from most forum software, which will only show a list of thread subjects on a given board’s page. Because of the way the content of each thread’s first is shown, subjects for each thread are not mandatory on textboards.

In addition to the above, threads are pruned from the database after they see a certain amount of inactivity. Hermes, for example, is configured to delete the oldest thread if the total number exceeds fifty on a single board.

If  you add images to the mix, you get an imageboard. It’s likely you might have heard more about these, such as the infamous 4chan and its Japanese counterpart 2chan (both NSFW).

Perhaps due to in part of the transient nature of posts and identity on these text- and imageboards, the culture that develops is that of a hivemind. Voices that try and rise above the others by using a name or tripcode are often berated and ignored. Of course, anonymity comes with its own problems. Unfortunately, I’m not an anthropologist, so I can’t really go more into that.

Why Hermes? And why aren’t you spelling it right?

‘Hermes’ is the name given to the female protagonist of Densha Otoko by the denizens of Aladdin Channel after Yamada receives a set of Hermès teacups from her. The Internet was down so I couldn’t Google around for cool names to give my textboard, so Hermes ended up being the name of choice. The name in the drama isn’t pronounced with the lovely accent on the e, so I elected to not use it.

Django Unplanned

My lack of Internet connection put some limitations on what I could use for this project. Sure, I could enable tethering on my phone, but to pull down entirely new software packages? That would get messy for my phone bill. Django happened to be installed on my Virtualbox after an abortive attempt at another web site, so I figured ‘hey, why not use Django?’

Reading the tutorials on my tiny S3 phone’s screen was a less than exciting experience, but with just a couple of hours work I had a super basic textboard working. Django makes CRUD applications very easy to implement. It only took a few dozen lines of code to implement the initial database structure, and the templating system for the front-end is pretty intuitive when it came to the front-end.


The demo instance of Hermes (Hermes Channel) is deployed on Heroku, an infrastructure-as-a-service platform geared towards people like me who hear the word ‘infrastucture’ and fall asleep, only to be greeted by dark nightmares of configuration files and servers. It’s so easy to use: Once your Django app is ready and you’ve got a file describing your prerequisites you need, you can just commit to a Git branch hosted on Heroku, and they deal with the deployment automatically.

It also has the added benefit of being free: You get a free 10k row Postgres database, and 750 free hours per month to run your dynos. An Heroku dyno is basically a Linux instance that your application (or worker jobs) will run on. When you deploy an application to Heroku, it is deployed to all your dynos and started automatically. If you have just one dyno, the free allowance is enough to last the entire month! Of course, if your application has high traffic, it is likely you’ll need more than a single dyno to support it. But then again, if you have that much traffic you’re probably earning enough money to support beefing up your Heroku too, so…

The Demo!

Hermes is effectively feature-complete, so why not check out the demo? It’s mobile friendly! It’s easy to make posts too. If you’re interested in knowing how it all ticks, the source code for Hermes is available on Github.

Okay, fine, you can have a screenshot.

This feels familiar somehow.

This feels familiar somehow.

Check it out! Hermes will be released under the GPLv3. Releasing the software was always the main point of the project, the fact there’s a demo instance is just a pleasant bonus! Just follow the instructions on the Github page for installation, and you’ll be away (provided you know a bit about how Django works).


Curses! – A Post That Ends Up Being About Capturing Ncurses Output And Converting It To HTML

So I had an idea the other day! I started to implement it, but it turned out it was already done way better elsewhere, so I dropped it. But let’s talk about it anyway, because it’s not the worst idea ever and I had a fun experience as a result.

For some reason, I was under the impression that a really good web-based Interactive Fiction interpreter wasn’t available. I have no idea why I held this idea, because I had been using Parchment to play Z-Machine games online for the past couple of days. Maybe I figured there wasn’t a good online Glulx interpreter, but I was wrong about that too. In any case, the idea was simple: Provide a reasonable method of playing Interactive Fiction online with near-perfect emulation of how it would feel when played on a native interpreter.

The method I chose was chosen because I am lazy. It was literally to be a bunch of different things I found online all cobbled together. The fundamental plan was to run a Linux Z-Machine interpreter for each user, take ‘screenshots’ of the terminal, convert this screenshot to HTML and serve it to the user via a web interface. Input would be sent down to the interpreter from the browser, ‘screenshots’ get sent back up. This would have meant the user experienced ‘lag’ when typing, but I was just pleased that I thought I struck upon a novel method of delivering an authentic native Z-Machine experience in the browser.

Rather than talk about why that was all a terrible, terrible idea, let’s focus on the journey and not the aborted destination. While the idea didn’t pan out, I did learn a thing or two about the terminal and ANSI codes. In fact, I even found and fixed a bug in tmux! The fix hasn’t been accepted as a patch yet, and it might not be because it’s not the cleanest solution to the problem… But I did discover a bug, so yay!

So how did I end up doing that? Well, it turns out that the very first step of the journey was a doozy. Capturing output from the terminal is not usually very difficult. I was using a Z-Machine interpreter called Frotz to do the heavy-lifting of running the IF games. Naturally, my first attempt was redirecting the output of Frotz to a file and finding a tool to convert the ANSI to something more web-friendly. That’s when I came across, which didn’t work at the time for a very particular reason. Frotz uses something called ncurses to draw its screen. Rather than scroll the terminal when new text has to be printed, it prints over the existing space by using special terminal control codes called cursor movement instructions. These instructions are used by ‘printing’ them to the output. When one of these characters is ‘printed’ by the terminal, the cursor is moved according to the instruction rather than a new character being printed. After being moved, new text is drawn over the text that was previously present in that spot.

This means that Frotz doesn’t output lines delimited by newline characters. Instead, it prints out one very long line that uses these cursor instructions to move the cursor around and redraw over already printed characters. This confuses ansi2html, which tries very hard but eventually can’t keep up with the complicated sequence of cursor movements. This explanation doesn’t do the process justice, so here’s a few pictures. First up, here’s a picture of what Frotz looks like when it’s running (or if the output file is printed using ‘cat’):

That looks pretty standard, right? Here’s what the underlying ANSI looks like:
ANSI Horror

Wow. Interestingly, you can ‘cat’ this file and the output looks exactly the same as the first screenshot (Technically speaking. You would have to strip out a screen-clear instruction first). So ‘cat’ can handle it, but produces this:
Nice try, ansi2html

It’s a good effort, but it’s clear that ansi2html can’t do this. Other tools purported to be able to convert ncurses ANSI output to something more usable, but I tried them to no avail. I needed some sort of pre-processing step: To convert this mess of ANSI characters into a more easily manageable mess of ANSI characters. Enter tmux.

Tmux is a terminal multiplexer, just like ‘screen’. It has one advantage over ‘screen’ that I was interested in: It can capture coloured ‘screenshots’ of the terminal and write them to a hardcopy. A hardcopy is basically just a screen capture, like the output file from earlier but stripped of cursor control characters and the like. Tmux generates this by examining each individual character in its viewing pane and deducing which ANSI flags would have to be set to produce that character. In effect, tmux produces a perfect facsimile of terminal output, minus any crazy terminal control characters. Generating the hardcopy isn’t hard. I opened a terminal and booted up tmux. Once within tmux (which again, functions very similarly to ‘screen’), I started Frotz and used another terminal to send the commands to the tmux process, causing it to capture its current viewing pane to a buffer and then saving that buffer to a file called tmux.hardcopy:
tmux capture-pane -eJ ; tmux save-buffer tmux.hardcopy

So did it work? We should be able to ‘cat’ the hardcopy and get back the same image as the first one.
So close

Okay, but where did the colour go?! I can see it in the header, but it suddenly disappears. Well, ignoring that, how does ansi2html perform with the hardcopy?
Nearly there

That’s so much better! But the colour is still missing. What gives? Well, it turns out that tmux has a bug which incorrectly sets certain flags. If certain attributes change between characters (in this case, the ‘reverse colours’ attribute), a special character is printed which resets all attributes. The remaining attributes are then re-added via their own special character instructions. However, the colour instructions are not refreshed like the other attributes, so suddenly we’re missing all the colour from the output from that point on because tmux believes it only has to print the colour changing code once at the start of the hardcopy, rather than after every attribute reset. So I wrote a patch for tmux! It’s one of my first experiences with contributing to open source.

As I was writing this, one of the tmux maintainers got back to me regarding my patch: It’s good, but it’s not quite there. It has its own problems, but we’re working through it to get a proper fix together. Hopefully no one will ever actually need the patch above!

Anyway, shortly after finding/fixing the tmux bug, I realised the project as it was envisaged was fairly pointless. However, I did get to find a real-life bug in something open source! And I got a blog post out of the whole experience too. And of course, this little post wouldn’t be complete without a final screenshot of ansi2html finally taking on an ncurses program and winning:

Strictly speaking, I had to modify ansi2html to get the reverse colours working correctly. You can find my modified version at this gist here. But yeah! There you go: How to capture output from programs that use the ncurses library and convert them to html! Looks like something good came out of the journey after all. Maybe I’ll talk about how I tracked down the tmux bug next time?

Interactive Fiction


Castle Darbenghast

You stand in a massive courtyard, surrounded on all sides by stone walls that seem to touch the sky. In front of you, there is a marble pedestal carved with ornate shapes of pugs.

There is a book on the pedestal.

>take book

>read book
The book is a collection of something called 'blog posts'. You turn to the latest one and begin to read..

Interactive Fiction is a bit like a book that you control, in the same way that your average AAA blockbuster from Ubisoft or EA is a movie that you take the lead role in. The primary difference, naturally, is the medium. Far Cry or Halo may be worth 60,000 words per second according to the old adage, but with a piece of interactive fiction the pictures you paint are your own. Interactive Fiction (or IF) games are also known as text adventures. What follows is a ton of waffle: If you get bored, just skip to the end of the post. I have some links that you must click.

In a piece of interactive fiction the reader is given a chunk of text. After reading the text, the player must now react to it. By providing an action to the game, such as ‘look’ or ‘punch mugger’, the game decides the outcome of the action and prints another block of text to respond to. This event-response interaction continues until the story reaches an ending, whether that be a happy one (becoming king of the land), or one that’s slightly less optimal (becoming the court jester).

While the parsing and variety of actions in these games are impressive, they are limited by the imagination of the game’s author. Pretty much everything you type will be of the form ‘verb noun’, with a smallish number of verbs. Don’t be tricked into believing you’re writing a story with the computer: You’re an actor in someone else’s world, and they’ve already decided how the story should end.

In this regard, I would compare Interactive Fiction to a computerised version of a highly railroaded Dungeons and Dragons game. The dungeon master already knows how you the players will advance, and it’s up to the group to stay on the track defined by the dungeon master or face the consequences.. Or even simply be flat-out told they can’t perform certain actions for fear of derailing the story. However, much like a well-run railroad, a great piece of interactive fiction won’t ever leave you wondering how to move forward, or trying to get into the head of the creator to attempt to divine the next move. Instead, you feel like a person in a living breathing world, doing what would come naturally. Even if you can’t break the flow of the game, with some good direction and writing you’ll actually want to stay in the flow.

Another example may be in order. Below, I’ve played through a tiny amount of the legendary IF known as ‘Zork‘. My inputs are prefaced with a >, the rest of the text is provided by the game.

Copyright (c) 1981, 1982, 1983 Infocom, Inc. All rights reserved.
ZORK is a registered trademark of Infocom, Inc.
Revision 88 / Serial number 840726

West of House
You are standing in an open field west of a white house, with a boarded front
There is a small mailbox here.

>open mailbox
Opening the small mailbox reveals a leaflet.

>get leaflet

>read leaflet

ZORK is a game of adventure, danger, and low cunning. In it you will explore
some of the most amazing territory ever seen by mortals. No computer should be
without one!"

>go southeast
South of House
You are facing the south side of a white house. There is no door here, and all
the windows are boarded.

>go northeast
Behind House
You are behind the white house. A path leads into the forest to the east. In
one corner of the house there is a small window which is slightly ajar.

>open window
With great effort, you open the window far enough to allow entry.

>enter house
You are in the kitchen of the white house. A table seems to have been used
recently for the preparation of food. A passage leads to the west and a dark
staircase can be seen leading upward. A dark chimney leads down and to the east
is a small window which is open.
On the table is an elongated brown sack, smelling of hot peppers.
A bottle is sitting on the table.
The glass bottle contains:
A quantity of water


And so on. The example has hopefully made the idea behind IF clear: Interactive Fiction is a story that you have a degree of control over. In particular, you control which paragraph gets printed when. You do this by navigating and interacting with a world described entirely by text (in the majority of games. Some feature graphics, but those are far and few between).

Why is this so amazing? Well, truth be told, in this age of AAA blockbusters and superb indie studios, maybe text adventures are a bit archaic. However, interactive fiction still has its merits. For one thing, it’s still fun, just like how reading hasn’t aged a day since the press was invented. For another, people are still writing text adventures! You might have noticed in the example above that Zork was first published in 1981. People are still making these games, over twenty years on. They’re still wonderful, ageless experiences. From a new reader’s perspective, there is a vast library of IF out there and, because of the near universality of how they’re played, once you’ve played one you’ll know how to play them all. For potential story-tellers, IF is a very interesting medium to work with. Outside of the classic Choose-Your-Own-Adventure books, there are very few text-based ways for authors to provide an interactive experience for their readers. What better way than to let them discover with their own actions the world you’ve crafted?

Basically, if you like books and you like pretending you’re a character in a book, you’re going to get along fine with Interactive Fiction.

Before I set you loose on some of my favourite introductory examples of the genre, let me give you a quick primer on a few common text adventure commands:

  • >go <direction> – There is seldom a more often used command than the go command. Given a direction, this moves the player from one location to another in the game’s world. So common is this command, most parsers allow the user to drop the word go entirely, understand implicitly that a command like >north means >go north. The directions themselves can be shortened: North becomes ‘n’, south becomes ‘s’, etc. The classic directions in IF are the compass cardinals and intermediates, along with ‘up’ and ‘down’. Sometimes games will prefer you use terms like ‘enter’ or ‘move’.
  • >inventory – This command lists the players inventory. Most parsers will understand ‘i’ to be shorthand for ‘inventory’. Example output:
    You are carrying:
    A leaflet
  • >get <noun> – This command moves an item from the world into the player’s inventory. There is the opposite command as well: drop. Example output:
    >get knife
  • >look – This command displays the description of the current area the player is in. Usually, you are shown this description upon entering a room via ‘go’, but you might want to see it again to check if anything has changed (new items, a slightly different description of that brick wall..). Most parsers will understand ‘l’ to be shorthand for ‘look’. If you provide a noun to the command, you can examine an item in your inventory or in the room more closely. Example output:
    This is the attic. The only exit is a stairway leading down.
    A large coil of rope is lying in the corner.
    On a table is a nasty-looking knife.

These are just a selection of the seriously huge number of potential commands. More avant-garde games may not even implement some of these standard commands, or others simply might have no use for things like an inventory. If you’re wondering how to perform a certain action, try typing it to see if it works. For instance, if you have a closed jar and you want it to be open, try typing >open jar! You might be pleasantly surprised. If the author is doing a good job, most of the items you come across will have obvious uses, or contain a hint as to the proper verb in its description. Parsers also give you hints if you seem to mean one thing but have typed another; for instance, if you type unlock door, the parser is likely to prompt you: With what?. That’s your cue to say door key or some such. One last thing about commands: You can usually type ‘save’ and ‘load’ to.. Well, you can probably figure that one out.

Okay, it’s time. You’re in for a treat. To play interactive fiction and most text adventures, you’ll need an interpreter and game files. The interpreter will run the game files, which are typically in .z5 or .z8 (known as Inform) format. There’s also the option of playing games line using online interpreters. I’ll close out this article with links to WinFrotz, a Windows Inform Interpreter, the IF Database, where you can find many, MANY games, and links to some great introductory or otherwise noteworthy IF games:

  • Zork – Where would we be without Zork? Explore the dungeon, get treasures, solve puzzles. Very pure, and very hard. This game is many people’s first experience with IF, but I’d say it’s probably too unforgiving. If you’re a glutton for punishment, go for it!
  • Photopia – A story by a modern Interactive Fiction master named Adam Cadre, Photopia is a perfect introduction to Interactive Fiction. Don’t read the reviews. Either play it online, or if you want the real experience, grab a Glulx interpreter and the game file proper and play it like that. Just don’t read the reviews, okay? If I remember right, the DOS version also works a treat.
  • Spider and Web – You’re a tourist in a big city, and have somehow ended up in an empty back-alley. How strange. Safely playable online, and fairly forgiving in terms of mechanics and difficulty. Not 100% introductory, but definitely a shining example of a well-written piece of fiction.
  • 9:05 – Another game by Adam Cadre. You wake up at 9:05. Time for another day. Very, very short game. I’d say it’s a brilliant introduction to IF. Play online, be amazed.
  • Ad Verbum – Something a little more unconventional. If you’re a fan of puns and wordplay, this is a delight. The parser is a little different from your average game. Maybe cut your teeth on one of the other games in this list before coming to this one. The objective is simple: Remove all the items from a condemned house. Of course, it’s not that simple. Here’s the online link.

Good luck, and have fun!

You finish reading the blog post.

See you next time!

On Pretending To Write

Just a short one today, I’m in Dallas and it’s really nice! Very warm.

Let’s talk about writing. Writing is pretty fun, I recommend it if you have the time (and everyone has time). But what’s the point? And what should you write about?

I’m not a very good writer, at all. It’s difficult to be a great writer when you’re so good at being concise, or when other people have already written what you wanted to write, but a hundred times better. Being a mediocre writer is not an excuse for slacking off and giving up, however. Virtually everyone starts off at the same level of awful, so it’s often just a case of showing up and putting in the effort. This is true of everything, so we’re not really exploring writing specifically right now.

So with writing, what’s the step-by-step to becoming better? Of course, it depends on what your goal is. If you want to be a fiction author, you need to spend time learning the fundamentals of story telling. If you want to write a successful blog, you need to have a clear vision for the content you want to provide. Both require practice, but sometimes it’s harder to write one style over the other.

For instance, right now it’s easier to write a blog than it is to write fiction, because right now most of my energy is spent on work things. I get home, and the last thing I want to do is try and construct a worthwhile narrative. Rather, I’d like to whine and moan and vent. What better medium than that of the humble blog? But alas, moaning is not the order of the day.

I want to become a better writer. To that end, I have TWO writing based activities in my timetable. One: I write a blog post every week. Sure, they’re not great, but every post is a step in the right direction. Two: I try and plan out stories. Proper fiction. I’ve read more than my fair share of fiction writing guides, so it was high time I actually tried to push out a real piece of work. Both activities have their own challenges: Writing a blog post needs a subject, writing fiction requires an imagination. I lack both, but my eleventh hour superpower is finding something to write or muse about, so that’s handy.

Writing non-literary fiction isn’t ‘hard’ in the sense that you have to brave the dark, cold world of authorship alone. It’s a well-trod path. There’s theories of story-craft already devised and waiting for you to apply them to your writing. Let’s go through, very quickly (because it’s far too late), the first three key structure points that your story has to hit before it can be considered sound:

1) The Opening, and Hook – In the first twenty or so pages of your novel, your protagonist must appear, and something exciting that entices the reader to keep reading. For instance, the introduction of a compelling setting that demands further attention (think The Fifth Element, Final Fantasy 7).
2) The Inciting Incident – The event that pushes the whole plot into motion. In The Lego Movie, this is when Emmet finds the Piece of Resistance, shifting his whole life from the usual ‘follow orders, tow the line’ ordinary to the dangerous, thrilling adventure that is the quest to keep the Piece from falling into the wrong hands.
3) The First Plot Point – The moment that everything changes, and that change defines the goal of the main characters. In The Lord of the Rings, Frodo steps up and declares that he will bring the Ring to Mordor. Note that he had only previously agreed to take the ring to Rivendell. His resolve to continue the quest defines the First Plot Point, and drives the remainder of the story.

And then.. Well, that’s for another time. Indeed, the significance of each milestone is also currently a mystery to you, my reader. I recommend checking out Larry Brooks’ Storyfix website for more information while you wait!

The Hullet Bells – Part 1 (A Primer on Shmups)

As a would-be hardcore gamer, for me shoot ’em ups, or ‘shmups’, are a fascinating intersection of complexity, fun and playability.

With humble roots in Space Invaders, shmups began with a simple premise: The player controls a ship (or perhaps a flying witch or android) and must defend themselves against wave after wave of enemy attacks. Typically, the player will shoot them, although some games reward dodging over destruction.

The genre split in to two distinct schools of design: fewer, often faster bullets, and denser, slower bullet clouds. The former emphasises reaction speed, the latter memorisation. For example, R-Type and Gradius fall in to the former category, while games such as ESP Ra. De and DoDonPachi epitomise the other.

ESP Ra. De, a bullet hell game
R-Type III, a more traditional game focused on environment

Towards the end of either type of game, the two styles begin to converge: Bullets can only get so fast or dense before they become impossible to dodge, so elements of the other style begin to creep in.

The mechanics of these games vary. Often in simple games, the only variations will be in the graphics and bullet patterns, while the mainstays of lives, power ups and bombs are changed only in token ways. Such games are not necessarily bad! I can revel in the simplicity of a game like Strikers or Raiden, so even with limited mechanics it is possible to construct entertaining games.

That isn’t to say that there isn’t innovation happening! Far from it. The arcade roots of shmups meant that you had to stand out in a sea of other shmups. Some games introduced alternate modes of fire, giving the player a choice between whether they mow down their enemies with scattered shots or concentrated blasts. Others capitalised on the nature of the competitive high score lists omnipresent in the arcade, implementing complicated scoring systems that would require months to master, but for huge score rewards.

More recently, games like Ikaruga have aimed to maintain the old school shmup elements while placing unique and innovative mechanics on top. In Ikaruga’s case, the inclusion of the polarity switch (each polarity allowed players to absorb one of two kinds of bullet) added an entirely new dimension of gameplay, requiring not only that players dodge bullets, but also take in to consideration whether they should be absorbed or not.
Ikargua is a challenging polarity-based shooting game
Generally speaking, once play begins the player will always be looking at the playfield, with the ship present on screen at all times. Plot is sacrificed for an uninterrupted game experience, due to the very nature of the arcade itself: players are here to play games and not take up time on the machine watching cutscenes! This was something of a missed opportunity. CAVE, the popular shmup creators, would be forced to explain the majority of the plot in a 15 second cutscene at the start of the game, with the remainder inferred from short boss dialogues and cryptic ending scenes (if any). With the advent of releasing shmups in both the arcade and then porting them to home console, games have begun to include a longer ‘story mode’ in addition to the ‘arcade mode’ they would normally experience.

This is a completely different story to the doujin and independent game scene. Doujin games are created with the intention of sold at Japanese conventions. Touhou is a popular doujin game shmup series. While the story is probably just as deep as any given fable, a huge fan community has sprung up to fill in the blanks for the world, creating a vibrant living setting with hundreds of different interpretations.

The independent game Sine Mora has a very strong plot with a moderately challenging game to go with it. Indeed, the plot is explained over the course of the game with haunting monologues between levels, and heated dialogue during the game itself. In a rare twist for the genre, control is occasionally taken from the player for plot purposes.

The world of shmups is hugely varied, despite the basic principles being the same between games. This thread that runs through them means skills learned are transferable, while the player can still experience something new and challenging. The best way to experience it is to get out there and try some of the linked games in this post! I can’t possibly describe the fun you’ll experience.

I have a deep enjoyment of these games. While I don’t have the artistic ability or level design experience, there is still one thing I can do to help this dying genre: I can write an easily extensible, open source engine for the creation of shooting games. Over the next few months, I hope to build a small demo game in this engine, graphics be damned! I will also have to write the engine, of course.

I will document this journey here, both to provide insight in to the development process and to keep myself motivated. Maybe one day you’ll even want to build a shmup yourself!

A Primer on Speed-running, and Some Generic Tips

What’s all this speed-running malarkey about?

As you may or may not know, back in the day (read: 9 months ago) I started to speed-run Super Meat Boy, a fast-paced platform game starring a walking cube of meat, on a mission to save his equally cubular, bandage-covered girlfriend from the evil (or maybe just misunderstood!) Dr Fetus. For those not in the know, speed-running is pretty much exactly what it sounds like: a person attempts to complete a video game in the shortest time possible. Different games have different criteria for what constitutes completion. In fact, the same game may be run in different manners, with each class of run making up a category with its own records and strategies. For instance, Super Meat Boy has two categories that are regularly run: any% and 106%.  Any% is so called because it is an attempt to reach the end credits of the game via any means necessary. It is a common category across games, and often heavily features glitches to skip major portions of the game’s normal sequence. Such skips are known as sequence breaks. Not every any% run features sequence breaking, but most games feature at least a small sequence break. Super Meat Boy features a few that shave off tens of seconds, while The Legend of Zelda: Ocarina of Time has a sequence break that skips nearly the entire game.

106% is Super Meat Boy’s equivalent to most games’ 100% category. Rather than just reach the end credits, the game must be fully completed: For instance, all items must be obtained or all levels beaten. Typically, the game itself will feature some form of statistics page that would confirm that the current save file is, in fact, a 100% completed file. These attempts often require completely fresh strategies from any%, as major sequence breaks become very rare. A full 100% run of a game can take more than twice the length of an any% run. For instance, a decent Super Meat Boy speed-runner will clock in about 22 minutes in any%, while the current world record for 106% rests at around 1 hour 25 minutes.

When it comes to speed-running, I’m very much a fan of watching the 100%ers, not so much doing it myself. You have to admire the amount of time they put in to mastering each individual skip and trick, before putting them all together in a multi-hour marathon of incredible skill and patience. The moment a run goes sour, many runners will ‘reset’ rather than finish the attempt in order to save time, starting the game fresh. This can turn a two hour session in to a four, six hour session. That said, 100% resets are definitely rarer precisely for this reason: You don’t want to throw away two hours of work. Your average Super Meat Boy 100% run will feature upwards of 50 deaths, and no resets after the half-way mark. However, my chosen category is any%, and it is a very different story…

Any%: 100% for people on the clock

I run any% because I don’t feel I have the time or patience to run 100%. 100% would be back on the table if we were talking a sub 1 hour average run length, but that is usually not the case for most games, and definitely not for Super Meat Boy. With any%, I can sit down for 20 to 25 minutes and blast through the whole of the game, with an audience of five or six watching the joy and despair as it unfolds (speedrunning is often performed while streaming on a broadcasting service such as It’s a fairly relaxing experience, unless you start getting close to beating your personal best, then things can get a little stressful! My personal best is 22 minutes, while the world record is 18:40. You might say, ‘hey, that’s really good, you’re only three and a half minutes behind the world record!’ And I’d sheepishly smile and have to explain that 18:40 is a nearly perfect performance for a human player, and that being three and a half after it is comparable to being three seconds behind Usain Bolt in the 100m (which he famously ran in 9.77).

If you’ve got twenty minutes to kill, I recommend watching it for an idea of just how good one person can get at a game. This record has held up for over a year, and in speed-running that’s an eternity. Once you reach the amateur levels of speed-running (In Super Meat Boy any%, we’re talking around my time), you begin to approach the old world records. Only then do you realise the staggering difference between the current world record run and the previous records, even if the new record only beats the old record by a handful of seconds. Why do you make this realisation? Because eventually, you become better than any casual player of your chosen game, but not as good as the guys who have been playing for months, years longer than you. In short, you hit…

The Wall

It’s 4am GMT. Even the Americans are starting to call it a night, wishing you good luck as they leave your stream one by one. It’s the eighth run of the night, and you haven’t even begun to approach the sort of time you managed to somehow pull off two weeks ago. That divine spark has left you, and now you realise that you’re just not cut out for this speed-running business. You’re gonna quit. Right after this last run.

Of course, it’s never the last run. But you just can’t beat your old time. It’s no world record, but it’s a giant stumbling block in your progress towards becoming the fastest player of all time. This is the wall. And actually, after this wall… It’s walls all the way down. This is the essence of speed-running, and I believe you don’t really get the concept of the run until you’ve experienced this level of perfectionism/fanaticism. Not until that day when it all comes together: That trick on level 9 suddenly makes sense, or you’ve finally figured out a safer way to get through those obstacles without dying so often. Not until the day you storm the game, deathless and perfect. Not until some jumped-up schoolboy brat beats your time by a full ten seconds. Not until your thumbs ache and your eyes want to fall out and you start to feel sorry for the poor player character, who you put through so much. That’s speed-running.

How Do I Get Better?

You play. You play, and you play, and you play. But that’s not enough. I’ve played Tetris for over 10 years, and I can stomp any of my friends any time. I’m decent at single-player Tetris, and that’s enough to beat casuals at multiplayer. Put me up against someone who actually practices and learns the Tetris meta-game, versus strategies, most effective set-ups… and I crumple. There is a huge difference between someone who plays games and someone who learns them. Many of the major breakthroughs in world records come from discovering a previously unknown glitch in the game. In Super Mario World, glitches that allowed players access to areas without various pre-requisites granted massive time saving opportunities. Even an amateur could take the world record with such tricks, but wouldn’t hold it for long as the better players start to incorporate it in to their runs.

Remember how I was talking about how sometimes you just play a blinder of a game, then just can’t repeat that success? Many world records are formed just like that. The player is of high skill, and just has one fantastic day where everything works. This is not to diminish their skill, but to simply motivate other players to reach a similarly high level of skill that is representative of the WR holder’s average performance. Then, the hunt begins. It’s time to start turning over all the rocks, poking about in every corner.. Find the killer strategy/glitch that no one has thought of before, and use it. This is your ticket to the WR. Even once the word gets out, you’ll still be the record holder for some time, thanks to your previously hard-earned skills. And then some jumped-up schoolboy brat will beat you, but you know what? You did it that way, and you did it that way first.

There is… Another way…

This one is nefarious! Pick a game no one will ever play. Pick something old, pick something that’s not on Steam, pick something that would bore most people to tears. Pick something where you get to be the first person who discovers everything about doing it fast. Once you’re the world record holder, that jumped-up brat will turn up one day.. But not for a long time. And you’ll go down in history as the first WR holder of “The Adventures of Sally Smith: Prince-Stealer Inc.”!

That’s about it.. We’ve covered what speed-running is, a couple of the common categories, then somehow segued in to motivation talk about how to be the very best, and ended on a lame joke game title. Not even a fulfilling conclusion or moral. This post went places, right? I’ve also spent 4 days on-and-off writing it, so that’s probably why it lacks any direction. Anyway. Byesies!