Nothing Special   »   [go: up one dir, main page]

⇠ Luna’s Blog

The NES Pictionary Bot, In Memoriam

Feb. 14th 2024 — Oct. 1st 2024

The Game of Video Quick Draw

In July of 1990, developer Software Creations and publisher LJN released Pictionary: The Game of Video Quick Draw for the NES. Perhaps most well-known today for its jarringly out-of-place high-octane soundtrack by the inimitable Tim Follin, the game makes you play bizarre minigames to reveal a drawing, and then — in traditional Pictionary fashion — you have to guess what was drawn, against the clock.

The game has more than 500 drawings built in, each made from a simple set of lines and curves. Here’s a small selection to give you a taste:

CAT, from the NES game
BULLS EYE, from the NES game
WRIST WATCH, from the NES game
CATERPILLAR, from the NES game
The game’s tileset. The blue tiles in the middle are used for the UI and minigames.

30 Years Later

In August of 2020, self-described software necromancer Foone posted the following thought:

foone🏳️‍⚧️ @Foone 26 Aug 2020
someone should make a bot that just posts drawings from NES Pictionary

This was the start of a thread where she reverse-engineered parts of the game, extracted the various drawings, and added the game’s win screen to the Death Generator. I even participated in the thread, helping to reverse-engineer a couple of things, and providing code to extract the drawings from the game.

I thought a lot about making the bot she’d suggested, but there was one aspect that I really wanted to get right — it had to still be a guessing game. The solutions should be made available for those who want to see them, but by default it should only display dashes indicating the letter-count of the solution, as in the original game.

This could have been achieved on Twitter via a two-account mechanism. The main account would post the image with the dashes, a secondary account would post a reply with the solution. Users could then mute/block the secondary account, or follow it if they wanted to always see the solutions.

Similarly, this could have been achieved on Mastodon using the Content Warning (CW) system, which allows you to put a post behind a warning and require action on the part of the user to actually view the post. The bot would post the image with the dashes, and then in a follow-up post, post the solution under a CW, making users interact to see the solution.

These solutions always seemed kinda clunky to me, and eventually I just forgot all about it.

Enter Cohost.


Posting, But Better

Opened to the public on June 28th 2022, Cohost was different. With a Tumblr-alike reblogging system, almost all engagement numbers hidden to discourage clout-chasing behaviors, no algorithmic discovery, just a reverse-chronological feed of the people you followed, what a novelty! But most unique of all, Cohost allowed posts to contain arbitrary HTML with inline styles — subject to certain constraints, of course.

This meant that all manner of text formatting, animation, and interactivity was possible. A community quickly formed around “CSS crimes”, making all sorts of wonderful things by pushing the platform’s capabilities to the limit. Blackle’s CSS Puzzle Box remains one of the most impressive creations on the site. I took part in this phenomenon too, making a zoetrope that shows your browser’s refresh rate, a demoscene-esque twister, a recreation of the Star Wars opening sequence, a light hypnotic induction replicating the site’s UI, and more.

This also meant that I could make a bot whose posts looked exactly how I wanted, and I could use the <details> disclosure element to put the solutions behind a clickable spoiler reveal, without having to do any multi-post-reply workarounds. Finally, it was time to shine.

In early 2024, I spent a couple of afternoons digging up old code, putting together a new renderer, and getting everything in place. Rust code would extract the game’s drawings, render them as SVGs, and produce a JSON manifest file, while posting to Cohost would be handled in Python using valknight’s Cohost.py. I teased the bot’s existence with a screenshot of the game’s infamous DRAINPIPE glitch puzzle, and a day later on February 14th, it went live.

I’d also snuck a few custom-made easter eggs into the pool of drawings — I had to include a few renditions of eggbug, the Cohost mascot, after all.

EGGBUG by @lunasorcery

Once out in the wild, the game quickly developed a life of its own, ceasing to be about guessing what was drawn, instead turning almost immediately into a hotbed for comedy, with people deliberately sharing wrong-but-plausible guesses, while still being careful to match the expected letter-count.

Speaking of letter counts, I added numerical indicators to the prompts to make matching them slightly easier. This feature was achieved using the <ruby> annotation element, and went live on February 21st.

With the easter egg drawings starting to show up, people naturally started enquiring about the possibility of submitting their own. I’d been creating the easter eggs by hardcoding the game’s tile IDs into a text editor by hand, but I knew I couldn’t reasonably expect the community to do something quite so cumbersome — I wanted to make it as approachable as possible. In late April I spent a weekend brushing up on my JavaScript knowledge, building a more user-friendly editor, and started taking submissions via the Asks system on April 28th.

This proved immensely popular, garnering dozens of submissions in the first day alone, and drawings would continue to flood in for months to follow. I’ve embedded a small handful of personal favorites below, but I highly recommend checking out the entire collection — there’s some absolutely phenomenal work in there, far beyond anything I ever expected.

BEACH SUNSET by @sirocyl
SNOW ON MT FUJI by @lifning
BUBBLE WRAP by @zeroefficiency
DADDY LONG LEGS by @emmmmmmmm
DEMON DAYS by @bekoha
YINGLET by @LiahZagarl
SIMCITY by @irina
VIBRI by @RavenWorks

Technical Notes

There were some fun technical challenges that came up during the bot’s development, which I realize may be of interest to some.

Cohost supports image uploads, but uploaded images are stretched to the fill the entire width of the post. For portrait-orientation images this can be undesirable, especially when viewed on a landscape screen. To avoid this, the images in the bot’s posts were embedded using data URIs, like so:

<div style="background-image:url('data:image/png;base64,iVBORw0KGgo...

This had the fortunate side-effect of allowing the bot to continue functioning during Cohost’s media upload outage of April 2024, though my sympathies were with the staff regardless.


Like numerous other websites, Cohost provides OpenGraph metadata for each page, enabling rich embeds when posts are linked to on other platforms. However, the generated description for each post leaves the content of any <details> elements in the open, so the solution for each drawing was plainly visible in the embeds. To counteract this, I took an incredibly low-tech approach — simply padding out the embed with extra text, in the hopes that platforms like Discord would cut the text off before showing the solution. Every single post from February 15th onwards contained the following text in 0pt font:

okay so now i'm just gonna put in a load of text that won't show up on-screen but should pad out the off-site embeds (like discord) enough that the solution won't actually get spoiled in the embed hopefully maybe. wouldn't it be great if cohost hid the spoiler tags from the embed text? i think that'd be neat. okay hopefully that's enough padding now fingers crossed. anyway if the embed is still going then gasp spoilers, the solution is

And in Discord it would render like this:


The letter-count hints were added using the <ruby> element. By default, this puts the annotation text above the main text; placing it below was achieved with the CSS ruby-position:under, and with -webkit-ruby-position:after for Safari support. I’d be remiss not to share this wonderful post making excellent comedic use of ruby annotations both above and below. I also found a quirk in how Firefox handles whitespace around ruby elements; it’s too involved to recap the details here but I wrote about it over on Cohost at the time.


The End of Eggbug

On September 9th 2024, the ASSC staff announced that Cohost would be going read-only on October 1st, and shutting down entirely by the end of the year. The outpouring of love and grief from the userbase in the following days and weeks was unlike anything I’ve ever seen. I myself was sobbing uncontrollably for days. It hurt so badly because what Cohost was, what Cohost represented, mattered so deeply to us.

I was initially torn about where to take the bot next. I posted on September 10th that I saw two possible futures; either I try to keep the bot running elsewhere, squashing its square peg into the round hole of other platforms’ limitations, or let the bot die a hero’s death.

Ultimately, I decided on the latter.

I can’t run this bot forever. Any time I’d leave the submissions queue idle for too long, I’d grow anxious about the size of the backlog waiting for me. The longer I’d leave it, the worse that anxiety would get. Given the choice between subjecting myself to that on a long-term basis, and retiring the bot alongside Cohost, I’d rather the latter — I’d rather let this be a fond memory from our time together.

One of my own fond memories of Cohost is the crow of the day tag started by @softfennec. I was saddened when I heard they didn’t intend to continue it elsewhere, but I fully respect and support that decision. When we take up projects like these, we do so on our own terms. We get to set our own boundaries and rules. We don’t have to keep going if we don’t want to. And maybe, just maybe, we’ll have inspired other people with our actions. To that end, for any fellow crow fans, here’s a photo I took recently:

Four birds, which I believe to be crows, sitting on the antennas on a neighbor’s roof, silhouetted against a cloudy sky
Olympus OM-20, Zuiko 200mm f/4, Kodak Gold 200, dev+scan by Come Through Lab

I’ve given a lot of thought to why the Pictionary bot in particular was so popular, and I think it ultimately comes down to the “yes, and” posting culture of Cohost. This could have just been a bot posting drawings from the original NES game. But people latched onto it and made their own game out of it. People loved it so much they wanted to contribute back to it, for no other reward than getting to share their work with their friends. People formed a community around it, and I’m so grateful that they did.

I just provided a canvas. The people made art.


Special Thanks

Finally, I believe several thanks are in order.

Thank you to programmer Tony Pomfret, artist Craig Houston, and musician Tim Follin for creating the original NES game. Additionally, thank you to oft-uncredited audio programmer Stephen “Ste” Ruddy for creating the game’s sound driver.

Thank you to Foone Turing, for planting the idea for the bot all those years ago, and providing incredibly useful reference for the reverse-engineering.

Thank you to Colin, Jae, Aidan, and Kara, for creating the only social media website I ever truly loved.

Thank you to the 179 artists who created an astonishing 486 custom drawings for us to enjoy:

AlexandraIDV, allister291, Amoni-The-Sabertooth, ansi, anton-exe, ArnoldArmadillo, avarisclari, axolotine, bck356, bekoha, blueengland, boppee, bored-penguin, Brisken, bugg-, BUTCHBONEZ, cake, Cania, CapnQueer, CeeMinus, CheepThePeanut, chillin, ChocoSune, chungoreus, clip, Curious, dedusmulntxt, deinonychus-raptor, DianeThePunk, DrinkTheStars, drmelon, dumple, Dvorakir, e-dt, elfy, emmmmmmmm, esiyae, estrogen-and-spite, FaeAlchemist, felidoptera, FeminineFreyaNyctophile, fennaixelphox, firey-iri, fluffy, foggles, foolishMachine, foone, foxounderscorecube, FruityPieQ, full-moon-girling, Fyter, Gadfly-Goods, GFD, girldork, glotch, GreenIntern, GreySleeves-Transhumanist-Bairoph, Guinivere-Of-Stranger-Tides, gumdiseaseXOX, Hafk, hedful, helo, Hexagon, hi-im-emily, hi-im-kaybee, hijpIxel, HunnyBon, idadeerz, incorrecthorse, into-the-void, Introducing, irina, itsonlythee, ixnoah, jckarter, Jeran, JerryEris, jmelody, kablaziken, keiya, KneecapRock, kobacatt, kodicraft, kossai, kschwal, lapouris, leilei, LiahZagarl, lifning, LouE, lunasorcery, mabeloid, macrocheira, Markus-McCloud, masklayer, Maverynthia, Mecha-Lewd, Meeep, mehbark, Mewkitty43, mic-row-ave, Millionsandwiches, Monacht, mothmouth, nature-nerd-sarah, negativeashi, nerferd, nickavv, nikro, NineAlex, Noyb, Odd-Camo, onyxxx, pajamaBeeVegan, PanopticalGhost, parttimerobot, pastille, pb-n-jk, PC36, pepperbloom, pepperly, phantasmaCora, polymath, PoorlyDrawnBees, PrincessFelicie, quat, quwyou, rahisaurus, RavenWorks, retro-warmachine, RobinProblem, rosettedotnet, Shoujo, shoy, sirocyl, skylark, SlushieCat, SnepGem, sofia-drawsmore, softchassis, Solemn-Elytra, SonicHeroes, Space-G, Spax, splatter, spookybiscuits, sprousprou, srxl, stormy404, SultryScribz, sundry, swiftyshq, Taeltales, Tanuki-Computing, TarotCard2, Tetromino, Thetheringpod, thingus, ticky, tit, tjelle, Trans-Scribe-Paige, twi, Urufusan, vaporstrike, velociraptor, viccy, VoxValentine, W3Rn1ckz, walther, wast, waste, webark, wildweasel, Wowls, xenodrug, zandravandra, zaratustra, and zeroefficiency.

And thank you to everyone who interacted with the account in any capacity. Whether you submitted drawings, commented guesses, or just shared it with your friends, your contribution was cherished. Without all of you, this would’ve been just a silly little bot posting drawings into the abyss.

You made this.

#cohost


Enjoyed this? Have thoughts? Drop me an email!
comments@moonbase.lgbt