Building a Nuclear Throne _ebooks Bot

16 Dec 2014

A little background: @horse_ebooks at some point was a spam Twitter account that followed some algorithm to tweet odd amalgamations of sentences that people decided was cute or interesting. Eventually it turned into a weird art project thing but that’s not too important - eventually people took the idea and built their own little Twitter bots that did something similar.

Nuclear Throne is an amazing game by Vlambeer that I’ve written about before here, and it features little tips on load screens which are at times useful, at times amusing, and sometimes a bit inscrutable.

I decided to make an Nuclear Throne ebooks bot to combine the two.

First I had to extract the load screen tips from the game. I was hoping they’d be in a simple text file, but it turns out that GameMaker (the tool used to create Nuclear Throne) bundles everything up, art and sounds and text and all, into one big data.win file. I thought briefly about a tool to parse this but instead just opened it in a hex editor, and searched for a load screen tip that I already knew.

data.win open in a hex editor

Luckily, I found all the tips near each other, so I took the hex of this and saved it elsewhere. I then created a Python script to turn the ASCII hex into actual strings:

  • Convert each 8bit hex value to a character, discarding the 00s for padding and non-alphanumeric characters (not sure what they are used for)
  • Concatenate characters to form strings, but splitting where the discarded characters were
  • Skip any strings that were all caps (these seem to be used for weapon names)
  • Go through by hand and remove the few entries (index entries?) like ‘maxskill’; or ‘area’ that are not tips

My initial plan was to at least just tweet these - doing some kind of language processing on them with markov chains (whatever they are) seemed a bit out of my league, but @BooDooPerson has a guide on making your own ebooks bot.

I thought I’d run into a hitch - the guide expects you to download a CSV containing the tweets of a real person. Turns out all it uses is the ‘text’ field from the CSV, and the only difference between a CSV with a column labelled ‘text’ and a bunch of strings separated with newlines is the word ‘text’ at the top. And no empty lines or the script will choke.

So, I used mispy’s script to process the load screen tips into a ‘pseudo-Markov generator’, which analyzed the strings and mashed them together. All that was left was to tweet them.

Unfortunately, Twitter doesn’t make it easy to make a bunch of bot accounts (you can probably figure out why). In particular, if you want to use Twitter’s API to tweet, you need to have your account authorized with a phone number. I registered @nuclear_ebooks but my phone number was tied to my personal account. Thankfully, Dalton Hubble describes a process where a primary account creates the Twitter app with the ability to tweet, which I created and added to @nuclear_ebooks.

The proof is in the pudding: a few times a day, @nuclear_ebooks will tweet an odd message that should sound familiar to Nuclear Throne players, if a little off. And if you message him directly, you can start a conversation with the little guy.

RECENT BLOG POSTS

Yesterday I attended my second gamejam, an eight hour event where teams form to work on small games together around some loose themes, which this time were Black & White, Rockets, and Masks. Read More...
It's early to say this, and maybe a little crazy, but I can't help but put Twenty, a simple game from Stephen French, in the same category as Tetris. Not just in the way it plays - though it shares that methodical feeling of clearing a space that transitions to crowded panic - but in how it takes just a single mechanic and a simple interface to create something truly elegant and timeless. Twenty deserves to be played for decades to come, just like Tetris. Read More...
![Trippy!](/assets/snake.png) Phantogram always puts on a great concert and at the last one I was struck by a black and white animated backdrop of concentric circles giving the illusion of a slithering snake. As a challenge I decided to see if I could recreate this effect in a web browser. After starting out with Snap.svg I realised I could probably do the whole thing in CSS. Read More...