GioCities

blogs by Gio

Atom feed Recent posts

⚙ How we made Befriendus ludicrously accessible

  • Posted in dev

Befriendus; everybody’s favorite visual novel about making alien friends. It’s got trolls, yes, but it also has a slew of accessibility options. You can adjust everything: color, font, motion, even spelling. It’s clean, it’s easy, and it works. Here’s how we did it.

Befriendus in-game menu, with accessibility options

When I was designing the basic accessibility framework I had these principles in mind:

  • Accessible scripts must be easy to write; work should never be duplicated
    • Demanding people write multiple versions of work is bad design and encourages accessibility to eventually be dropped in favour of efficient production
  • Humans should never do postprocessing tasks
    • We’re writing software; a computer should do any and all mechanical work, not writers
  • Accessibility options should have as granular control as possible
    • Whenever possible, players should be able to select exactly what they need, not be forced to use something that doesn’t match their needs.
    • Options should be compatible with each other whenever possible
    • Just pushing out transcripts is not accessible design.

The best way to explain these is probably to explain what we ended up doing, and how each design choice was made carefully in accordance with those principles.

Colour

We knew from the moment we started putting together logic for character colours that we wanted an optional high-contrast mode. One of the first characters written was Mituna, whose light yellow text doesn’t show up super well against our grey textbox:

Mituna dialogue; yellow text with normal spelling

This is good enough for most cases, but we definitely need a way to turn colors off. Black-on-grey has much more contrast and pops nicely for the high-contrast folks:

Mituna dialogue; black text with normal spelling

This is handled by the Hemospectrum subsystem, a part of FSE.

Characters’ colours are defined with their characters are (mituna, name=Mituna, hemocolor=gold) and processed by the dialogue system when characters speak. Colours are defined semantically and handled correctly at the appropriate stage in the pipeline. (As opposed to some horrible hack, like binding a listener to the option and manually editing every character’s colour in storage every time it’s changed.)

Anytime a color (gold, orange, #f00, #a20000, whatever) needs to be resolved (in the dialogue box, mainly), it’s passed to the hemospectrum function, which resolves colour names and colour codes to universal colour codes.

The logic there is for name resolution, but we also use this entry point to handle contrast logic. Whenever this lookup is made we check if the high contrast user setting is enabled. If it is, we return either black or white, depending on the tone of the colour requested. Since all the colour logic was in one place already, it was easy to add extra logic here. This also gives us the tools to make contextual decisions further down the line — a very light color might pop better as light grey or white, for instance.

Typing Quirks

Characters in the source material, Homestuck, have what are called “typing quirks”. Typing styles, basically. Characters type in different styles, ranging from semi-mundane style choices (lowercase, all caps) to incredibly elaborate (elaborate puns, ending every line with an emote, alphanumeric replacement). I could write a lot about how interesting these are and how they give characters a feeling of tone that the written word rarely conveys, but I’ll save that for another discussion. Brass tacks, we want our characters to do this, and that requires some work.

Now, to my eye, this looks like a build artifact. The “source code” is the script, and once the script is written there’s postprocessing replacement step that has to get done before we publish.

The alternative is for writers to write with quirks to begin with (WH1CH 1N 50M3 C4535 15 UNT3N4BL3) or to run a search-and-replace over the script every time they changed the script. From what I can tell, this is how Homestuck and pretty much every fanfic operate.

Fortunately for us, though, we’re running on a software engine! We can do better.

First, some groundwork. The main gameplay in Ren’py consists of dialogue in script files. Script text looks like this:

1
2
3
4
5
6
7
show !mituna at speaking

!mituna confused talk "she wouldnt leave without an ip adaptor that was the ONE thing i told her to bring"

!mituna idle frown talk "unless she was an idiot and just didnt. which i guess is unfortunately possible" (show_hashtags="#name of my autobiography: #\"unfortunately possible\"")

show !mituna idle

We don’t care about the stage directions here, let’s look at that dialogue:

On the first line of dialogue mituna is the character speaking, confused talk is his “pose” (the sprite displayed, if omitted it just uses the previous one), and the rest is the text that shows up in the dialogue box. When the story gets to this line, the character mituna says his line with a pose. (Remember that the character does the saying, this will come up later.)

The second line is pretty much the same thing, except you can see there’s some extra data called “show_hashtags” at the end. In Befriendus, the character dialogue boxes have an optional second line of text called hashtags, and this just tells the engine about that.

Here’s what that should look like:

Mituna dialogue; yellow text with normal spelling

But if you get Befriendus and play with all the default settings, here’s what you actually get:

Mituna dialogue; yellow text with quirky spelling

There’s some trickery going on here! Mituna’s text has its alphanumeric substitutions. Where did this happen?

Here’s the trick: all befriendus characters automatically modify their dialogue based on the currently set options. When the mituna character got the line, it changed the line to this:

1
"{quirk=mituna}unless she was an idiot and just didnt. which i guess is unfortunately possible{/quirk}"

That bit in brackets is a tag. Ren’py uses text tags as internal control commands for things like text speed or text style like boldness and italics, but it also lets you define your own tags to operate on the text. That’s what we’re doing here.

This notes that the quirk with the name mituna should be applied to the text if quirks are enabled, but it hasn’t actually done it yet. At the beginning of the route, when we first defined the mituna character in the first place, we added this line once:

1
2
init python:
    QuirkStore["mituna"] = [(c, "31073107"[i]) for i, c in enumerate("ELOTelot")]

The specifics of the right-hand side are the instructions for how to translate Mituna’s text and are black magic. What matters is we’ve told something called the QuirkStore how to apply the mituna quirk. Now every time text is rendered, as part of the engine’s default tag parsing (alongside bold, italics, links, etc…), the {quirk} tag checks whether quirks are enabled in options and applies them on-the-fly.

This lets us do some great stuff. We’re able to quirks anywhere we want (title screen tags, route titles, hashtags) without having to worry about extra cases: there’s no M*N problem since all the logic is handled in one place.

Keeping the semantic, pre-process copy of the text around has obvious benefits when it comes to translation or text-to-speech. Since the dialogue is stored correctly it’s easy for text-to-speech to read from the original text, rather than try to stumble through alphanumeric replacement or some other slurry.

Puns

I mentioned earlier that some quirks involve puns. While you could do this with regular expressions, (or write two copies of every script, yikes) we took a better approach and just piggybacked off the tags system again.

Here’s what Meenah’s dialogue looks like:

1
2
3
!meenah pissed "but HELLO we ended up getting busted {pun=halfwave}halfway{/pun} through and its only cuz of MY quick {pun=sinking}thinking{/pun} that we got here at all" (show_hashtags="#had to {pun=finprovise}improvise{/pun} like MAD")

!meenah snarky "{pun=betides}besides{/pun} i gave you my trolltag didnt i"

The {pun} tag is another Befriendus original. The text inside the tag is the original word, and the text after the = is the pun version. As with quirks, this lets the decision of what text to use be made at runtime, and globally. Tags hook into the global text system, so the pun and quirk systems are availible anc consistent anytime we display text.

Mix-and-match

I really can’t emphasize this enough: all the text features work together. You can toggle quirks independent of color, you can adjust puns independent of quirks, everything. Because everything is structured correctly, this is exceedingly easy to write for.

Motion

Unfortunately, “don’t duplicate work” has its limits, and animation is one of them. All our motion-intensive animations and flashing lights have to be written out twice; one full, one reduced. There’s a simple flag in the options menu that determines which one plays in the game.

While ATL has some support for conditionals, I haven’t found that to work consistently enough for our purposes, so we do have some icky logic mixed in with the script.

Here’s what Mituna’s flashing effect looks like:

You can see we tried to eliminate duplication as much as possible using subanimations here, and we even have a ConditionSwitch there at the end. But still, when we trigger the effect in-game, it looks like

1
2
3
4
5
6
if persistent.flash:
    show !psionicoverlay_flash #<- flash variant
else:
    show !psionicoverlay_noflash
with dissolve
hide !mituna with easeouttop

Fortunately, there are only a few cases of this in the game.

Juicy Builtins

Ren’py has plenty of built-in accessibility features that we make sure to expose to the player:

Renpy accessibility menu

As shown you can replace the fonts, adjust text size and spacing, and even turn on automatic text-to-speech.

This didn’t require any real work on our part, except for communicating to the player that this menu exists, which we do at the bottom of the options menu:

Befriendus in-game menu, with accessibility options

As mentioned previously, it was also important for voicing that we kept the original english script around instead of preprocessing the whole thing into quirks.

Translation

Ren’py also makes it easy for fans to make and distribute dialogue translations. All our hashtags, menu text, and dialogue use the translation system to make this as easy as possible. Things like pun and quirk tags also make it easier to translate non-words by exposing the intent behind them.

Transcripts

I can’t take any credit for this one either; Alien and Robin maintain incredibly detailed transcripts for all the routes and features on the game page using a web of google docs. I wrote a utility to pull transcripts from Friendsim, but we don’t use that because we have access to all the original scripts. This makes making transcripts for Befriendus is much easier than fan transcripts for, say, Pesterquest.

Alien and Robin actually maintain two distinct sets of transcripts. Alien makes traditional text transcripts of the routes (with colours and quirks) that are as close to gameplay as possible, while Robin makes transcripts that are as accessible as possible, with quirks and colours removed and with added text descriptions of effects, poses, and animations.

Unlike other accessibility features, these aren’t mix-and-match; any changes need to be manually propagated through all the transcripts. Transcripts, though, aren’t part of the prototyping cycle; they’re put together at the very end, sometimes even after the route releases.

Warnings

We have a warnings page with individually spoiled content warnings for each route. There’s a large button for this on the main menu, so players who are interested won’t miss it. We also try to include appropriate content warnings without spoiling the route, which can be a tricky balance.

This isn’t a traditional accessibility feature, but it does make the game more accessible.


Well, that’s what we’ve done so far. There’s more game yet to go, though; if we add some other major accessibility feature I’ll try to remember to come back to add it here.

I don’t have any groundbreaking takeaways here that I didn’t give away in the first paragraphs. Design your engine in a way to prevent humans doing duplicate work; let the data do the lifting for you. If humans have to do everything twice, no they won’t. Give players control; let them tweak their experience precisely to their liking. If done well, it doesn’t have to be all-or-nothing. Accessibility is necessary, and it doesn’t have to be hard if it’s designed properly.

pages Recommendations

  • 5 min read
  • Posted in pages

Recommendations for all sorts of things that don’t cleanly fit in a blog article or a Related Reading section.

In the spirit of trying to be useful, I won’t include extremely well-known items on this list. You don’t need me to tell you to play Half-Life or read GEB, but you might appreciate a nudge towards Superliminal or T.C. MITS. This is meant to be stuff you might not have heard of, not a drop-in replacement for top charts.

I’ll also try to avoid superlatives. Just know that if it made this page, I like it. In a similar spirit of concision, I’ll avoid recommending projects I’m personally involved in. Check the ol’ portfolio for that.

(Work in progress)

Articles

“Link In Bio” is a slow knife | Anil Dash, 2019
A really great opinion piece about how modern web “apps” try to maintain walled gardens at users’ expense.

Privacy and Power: Computer Databases and Metaphors for Information Privacy | Daniel J. Solove, GW Law, 2001
This is a relatively thick academic paper that essentially makes the argument that Kafka’s The Trial is a better metaphor for modern internet privacy issues than Big Brother.

Confessions of a Former Bastard Cop | Anonymous, 2020
This article written from the point of view of an ex-cop explains the systematic issues that encourage abusive behavior among police officers and how the structural corruption makes questions about the motives of individual officers less relevant than they would like you to believe.

Nintendo Conducted Invasive Surveillance Operation Against Homebrew Hacker | Andy Maxwell, 2020
A good overview on the shockingly dystopic Nintendo anti-modding campaign and the terrifying, personal war they waged on prominent researchers.

Books

The Education of T.C. MITS: An truly unique book published in 1942. A treatise on the scientific and mathematical thinking written in something akin to free verse. It is a study in mathematics, an analysis of society, a defense of science, and a scaffolding of philosophy all at once. I own multiple copies of this to lend people.

Videos

Why Electronic Voting Is Still A Bad Idea | Tom Scott, 2019
A short, simple video that clearly and effectively explains the basic reasons why electronic voting systems are inherently dangerous, despite whatever the latest technical innovation/fad might be.

YouTube’s Copyright System Isn’t Broken. The World’s Is. | Tom Scott, 2020
A long, interesting, in-depth about the reality of modern copyright law and the strange and often counter-intuitive way it intersects with internet culture and modern entertainment. (I also recommend many of his other videos!)

CO-VIDs: the gandhi trap | Ian Danskin, 2020
A short video essay about the optics of brutal state violence against peaceful protesters — Bob Altemeyer’s “Gandhi trap” — and the use of intentional disinformation campaigns to manipulate them. (I also recommend many of his other videos!)

The Death Penalty feat. PragerU | shaun, 2020
A long video essay about the political debate over the death penalty, the various factions pushing on both the issue, and their arguments. (I also recommend many of his other videos!)

CTRL+ALT+DEL | SLA:3 | hbomberguy, 2018
This is an exploration of CAD (and other weird gamer webcomics in general), but it also makes the key point that fiction can offer perspective into how the author sees the world, especially when seemingly distorted and out-of-touch with reality without meaning to invoke camp. (I also recommend many of his other videos!)

The Strange World of YouTube’s Corporate Propaganda | Big Joel, 2020
A video essay about YouTube and modern content platforms in general. Makes the excellent point that YouTube’s business model depends on it seeming like an invisible, natural force, when in fact it actively engages in relationships very similar to employer/employee, but with fewer protections.

Let’s go whaling: Tricks for monetising mobile game players with free-to-play | Torulf Jernström, 2016
A talk from a mobile game development conference that explores the “dark pattern” design techniques to make addictive video games that extract as much money from the public as possible. Dark stuff.

Software

Vivaldi: A web browser based on Chromium. Extremely customizable with lots of quality-of-life features and full support for Chrome extensions. Akin to what Opera used to be.

Greenshot: Excellent screenshot software. Low overhead with hotkeys for capturing a window, screen, or arbitrary region. FOSS.

ScreenToGif: Speaking of screenshots, ScreenToGif is an casual screen recorder for capturing quick clips or interactions. Has a very nice built-in gif editor too. Not a replacement for OBS, but much better for quick jobs. FOSS.

PowerToys: Remember PowerToys from Windows XP? Microsoft brought the name back for a set of Windows 10 utilities. Includes a colour picker, SVG previewer, and power tools for renaming and managing files in explorer. FOSS.

Wiztree: A windows-optimized disk usage visualizer (in the vein of k4dirstat) with special optimizations for NTFS drives with a readable MFT. Freeware with a donate nag button (I paid for mine)

Games

(Links omitted, as games are often available on your platform of choice.)

OneShot, 2016: An RPG maker adventure game. Mixture of Undertale and OFF vibes. Great story, great characters, incredible gameplay mechanics.

Hack n’ Slash, 2014: A combination hacking/adventure game where you get in-game tools to modify aspects of the game’s actual code. From DoubleFine, the developer of Psychonauts.

The Stanley Parable demo, 2013: Did you know The Stanley Parable has a free demo? Did you know it’s completely original content? Go play that sucker.

Hypnospace Outlaw, 2019: 90s internet simulator in an alternate history. Explore a network of terrible geocities template sites and find out a plot along the way.

Glittermitten Grove, 2016: A game with secrets in.

2064: Read Only Memories, 2015: A Snatcher-like adventure game. It’s got a robot friend!

The Turing Test, 2016: A Portal-like from Square Enix. Talos Principle and Portal vibes.

The Beginner’s Guide, 2015: From Davey Wreden, the creator of The Stanley Parable. “The story of a person struggling to deal with something they do not understand.” An incredible experience.

Gunpoint, 2013: A break from all the high-concept stuff. A stealth puzzle platformer set in a noir conspiracy plot.

Superliminal, 2020: A 3D non-euclidean puzzle game that uses forced perspective and strange loops to explore dreamscapes. I remember seeing the first tech demos for this online!

Antichamber, 2013: A 3D non-euclidean puzzle game that uses an upgradable cube gun to solve a very wide array of lateral thinking puzzles.

Mobile

Device 6, 2013: Very interesting experimental storytelling that leverages the mobile platform. Good story, good puzzles, worth a buy. iPhone

Nier: Automata, 2017: Okay, I said I wouldn’t include the obvious stuff on this list, but Nier Automata is so incredibly good I can’t not recommend it. Possibly the best video game.

Services

pCloud: Cloud file hosting. Extremely feature-complete, with cross-platform file sync, selective folders, shared folders, and public file links. You can even send someone a link that lets them send you a file. Can be pricey though, unless you get the lifetime option on sale. Referral link, free month ($5)

DigitalOcean: Good web hosting with very affordable plans for low-intensity use cases. Referral link, $100 credit

Music

I dunno I’m really into electroswing lately

Michael Bowman: Indie rock(?), very good. https://bowman.bandcamp.com

Metric: Alt-rock, wrote that one song from that one thing. https://www.ilovemetric.com

Cement City: Mostly fandom/club mix music. https://cementcity1.bandcamp.com

Owl City: Electronic music project. Did Fireflies. Owl City

Casual Sunday: for my homestuck fans out there. https://casualsunday.bandcamp.com

Unsorted

Thrilling adventure hour 2011-2020: A stage show set in the style of old-time radio dramas. Previously a live show at Largo, now ended with occasional much-worse studio recordings. Distribution seems to be in a very odd place right now, but the full back-catalogue is available on their Patreon (as lousy as I find that practice to be.) (Edit: full backlog of the removed podcast available here)

Homestuck 2009-2016: Homestuck! It’s a thing. A lot of archive content is unreadable on the public site right now, so I recommend using The Unofficial Homestuck Collection for the best reading experience.

gaming VR First Thoughts

  • Posted in gaming

I got myself an Oculus Quest 2 a couple weeks ago on a recommendation, and I have some thoughts! If you haven’t done VR before (like me, before I had my first thoughts) you might be wondering what you might notice besides the obvious. So, here are my observations, in no particular order.

Haptic feedback is really important

Haptic feedback is really important. Even though it’s just vibration, the difference between feeling something and feeling nothing when you touch things is worlds. The vibration does a decent job of simulating the feeling of resistance and letting you “feel out” the world, which is very important in games where the alternative is getting your prop stuck in a shelf.

You can actually stream games and it works

When I first saw that the recommended way to play PC games was over local wifi, I thought “no way. There’s no way you can get a high-quality video stream at that resolution with those latency requirements over wifi. I’m going to get a good USB cable and stream directly at 300 mbps and it’ll be excellent.” Turns out, no! With my (fairly normal) router, Virtual Desktop can stream a steady game at 1832x1920@60fps x2 over ~70 mbps with an imperceptible loss in quality. (Those numbers mean it’s good.) The connection is actually way more reliable than using the USB connection, and the Virtual Desktop app has a unified game launcher for both Rift and Steam which works great. If you look closely at dark areas you can see some artifacts, but in general I think this is a case where the video compression is extremely effective.

Facebook delenda est

I’m not going to write a whole essay about this here, but just after a few days of messing around with the device it was startling how vile Facebook’s integration with the system is. Facebook requires you to have an account to use the device at all. Facebook has a walled-garden store that permanently ties your purchases to your Facebook account (so you’re not able to delete Facebook without losing your property), and using the Oculus to play games that aren’t from Facebook requires you to sign up for a developer account in order to access the Android-standard developer options and transfer files.

Speaking of transferring files, there are a handful of ways to share Oculus content natively, and they’re all Facebook. As part of Zuckerberg’s ongoing campaign to monopolize and control all human interaction, if you want to share a screenshot from your Oculus, you can post it on Facebook, Facebook groups or Facebook messenger. If you have some technical skill, you can squeeze images and videos out of the device, but even that requires the at-will developer account mentioned above. It’s pretty disgusting.

It’s not all bad, though! This won’t just be me tearing into Facebook, I promise. People have done that well already. Okay, something fun…

Analogue triggers

That’s right, your favourite bit from the dreamcast controller is back and it’s actually used really effectively here! According to wikipedia triggers are usually analogue, but I’m struggling to think of a game that made good use of that. Aside from Super Mario Sunshine, which made… use of it.

Here’s a clip of me messing in The Lab, since that game has a robot hand that sorta shows you actuation pressure.

    ![Analogue trigger actuation in VR](https://www.youtube.com/watch?v=UDWQCTWMrrY)

This turns out to be really cool in VR, because it lets you manipulate your virtual hands in a natural, continuous way, instead of jerky, unnatural movements. Since the “grip” trigger is commonly used for gripping and squeezing, this gives you a very natural way of conveying degrees of force in a virtual environment.

Taking the headset on and off is a pain

Putting on the headset and slipping on the controllers, even when you’re sitting down, is a whole process. That means switching between tasks is way harder than with a PC, handheld, or console.

This seems like a no-brainer, but during the Oculus setup process alone the wizard made me switch from headset to computer to headset to phone to headset, multiple times, for really very unnecessary things. It requires you to pair the headset with a mobile app to manage basic device settings, which it really shouldn’t need to do at all. Having the phone (and Facebook account) as a required step to manage the device is downright dangerous, especially since the app didn’t work at all on the first phone I tried.

There aren't many horses

My mom came over the other day for a visit and she wanted to try VR. She loves horses and wanted to try a horse game, so I spent a few days browsing around for something with a horse in it. The only thing I was able to come up with was Skyrim VR, which has a mere eight horses, none of which you can pet.

All that to say, there’s really not a huge selection of quality games right now. It’s a relatively new platform, and even out of the limited library available a lot of the early games were made before people understood how to design games for VR. There’s your Half-Life: Alyx, Superhot, and HAX (with some other semi-game experiences, like Accounting+ and Job Simulator), but there isn’t an enormous library outside that, from what I’ve seen so far.

Motion sickness is a real issue

Remember those early games that were made before people understood how to design games for VR, from a few sentences ago? Turns out one of the things you need to design for is motion sickness. Putting a first-person VR perspective character who controls with traditional analog-stick-to-run-around movement feels bad.

There are a couple ways games get around this. Some games (SuperHot, Job Simulator) don’t have the player move at all outside of their play space, which they move around in by physically walking around. This is the most comfortable possible, if the design allows for it. In games where the player does need to move around on a larger scale than a few meters, you can teleport the player. Most games have this option (“blink movement”), and it’s pretty comfortable. Probably the most interesting design I’ve seen is the translocator in Budget Cuts, which gives you this delightful portal overlay that lets you preview your jump location and comfortably jump through it in one continuous camera motion. Here’s a little clip of that:

    ![The Portal Locomotion of Budget Cuts](https://www.youtube.com/watch?v=1BJ-lnDKRo4)

There’s also a very nice write-up of this system written by one of the designers here. You also sometimes see a variation of teleport movement (Accounting+, Alcove) where you teleport to predefined spots on the map, rather than moving around at will. This is a nice way of making sure the player can always comfortably reach the relevant objects.

Finally, some games have continuous movement where your character moves around based on stick controls, but the game adds a vignette during movement, which helps with comfort.

There are some non-motion comfort issues too. I played Psychonauts in the Rhombus of Ruin (2018) and… oh, it’s bad. The story and gameplay are great psychonauts content, but the core gameplay loop is possessing people and doing things from their perspective (which is accomplished with a trippy, psychonauts-y spiral effect), after which you need to immediately re-orient yourself by spinning around in real life. The object selection mechanic uses, instead of the normal laser pointer, the headset orientation. Whatever object is most squarely centred in your viewport is the selected object, which means a lot of precision neck movement. It’s a fairly short game and it still took me multiple play sessions, just so I could stop when I felt ill. Design has improved a lot since then, but design really matters.

Non-VR games don't work well

Speaking of motion sickness, remember Skyrim VR, from horses? That is the usual pretty-much-just-a-direct-port-of-SE Skyrim port, but with a few UI elements tweaked for VR. It is miserable. Gameplay has you moving around quite quickly and athletically without requiring any real-world movement, which just isn’t comfortable at all. Again, design matters.

Two kinds of depth

VR (well, 3D in general) introduces an odd new polygon occlusion problem. In traditional 3D graphics projection onto a 2D canvas, depth is represented by size, occlusion, and visual cues. (z-buffers.) With stereoscopic 3D, though, you can represent the depth of an object directly, independent of its size and position.

The long and short of it is, things that should be behind 3D objects can be rendered anyway, “blocking” them. If you open your menu, for instance, it will appear “in front” of the game, so you can always see the whole menu, but it renders at a fixed depth. At large sizes it appears to “cut through” the 3D environment, and for small elements it can confuse your depth perception entirely.

This is just an odd design consideration I had really never thought of before, but it’s really very odd to experience.

Valve made a good hardware bet finally

Valve has been really excited about hardware for the last few years and made several bets that didn’t turn out that well. SteamOS, the Steam Controller, and Steam Machines (click that, it’s incredible) were all such commercial flops that just a few years later they’re off the market. Steam’s investment in VR tech, though, looks like it’s turning out great. The steam in-game VR overlay works great, and the way it lets custom overlays like Desktop+ work in arbitrary games is just wonderful. I still wouldn’t want to get an Index at the current price, but software-wise Steam seems to be way ahead of anyone else.

Give me the half-life lore please

i finished alyx and it hurts. i’m dying. valve i said nice things about you. please. i had my first few seconds in ten years and then it was over and i need another hit

⚙ Stanley and the Death of Sourcemods

  • Posted in dev

My first published, “successful” piece of game content was The Raphael Parable, a little exploration game about exploring an impossible office. I say “game content” here because The Raphael Parable isn’t a game per se, but a map. A mod for the Steam release of The Stanley Parable that bootstraps the assets and mechanics to create a totally different game.

A new version of The Stanley Parable is releasing soon: The Stanley Parable: Ultra Deluxe is slated to be a remake with improved graphics, new endings, and console support. When I first saw this, I thought it would be a fun opportunity to go back to The Raphael Parable and tighten up some of the work that didn’t age well (I slapped it together pretty quickly, in hindsight, and it shows in places) as a new mod for the new version of the game.

"I love my car, I just hate my engine" Unity logo mug “I love my car, I just hate my engine”

Unfortunately, I quickly realized this was a non-starter for one simple reason: Unity. Ultra Deluxe is made by crowscrowscrows in Unity, which unfortunately stops this iterative development in its tracks. Let me explain:

The Weird Genealogy of The Raphael Parable

The Stanley Parable itself started as a mod. The original published version is a Half-Life 2 mod from 2011, of which the 2013 Steam release is an HD remix. The Source Engine, which Half-Life 2 is built on, makes it easy to author a set of new maps and release it as a “sourcemod“. Davey Wreden did exactly this to make The Stanley Parable; he took the basic 3D engine and a few generic office-themed assets and made a completely new experience.

📣 Hussie Exploited The Odd Gentlemen & Backers

  • Posted in fandom

EDIT 2021-04-13:

As of Kickstarter Update #36, What Pumpkin made the following statement about the source in this article: (They didn’t tell you it was the source in this article, I’m telling you that)

As an addendum, WP has identified the primary source of a disclosure to a well-circulated document of the Hiveswap development process. WP has been aware of a pattern of false claims this former employee has made since the end of their employment at the beginning of 2014. As this individual was not present during the end of the development contract with GC, nor the WP NYC development period, all of the information they have shared is based on speculation and conjecture.

There is a detailed analysis of this update in The Hiveswap Fiasco, but to summarize:

According to What Pumpkin, this is a disgruntled ex-employee who left the team in early 2014, meaning anything they said later than that is speculation. In addition to the obvious — that a whistleblower doesn’t like the practices they’re whistleblowing — this would mean they were not privy to the events of 2014 or later, making anything they said about that only semi-informed speculation.

This makes sense. Many of the claims made here early in the timeline turned out to be correct, and even verified by What Pumpkin later on. Some of the later ones seem incorrect; semi-informed exaggerations to make a point. As with everything else, I will note which claims are dubious. It is entirely possible some of this information was provided in bad faith, but some of still holds up.

In the same Kickstarter update, though, they explicitly confirm a significant amount of the news I broke, including some in this very article! I have also noted those cases.


When I wrote the Hiveswap article, I left a note asking for people to contact me if there were any facts I got wrong or major events I missed. A number of people took me up on that, which I am thankful for.

However, there was one big report I got that was too significant to just edit into the article. Because these allegations were new, and from a credible source, I thought they warranted their own article and research.

For the rest of the story about Hiveswap, see The Hiveswap Fiasco, to which this is a kind of sequel.

By the request of the source (because Andrew is known to be aggressively litigious), I have edited our conversation into a synthetic document. This is a summary of the claims from the source to preserve their anonymity and ensure clarity. I am not yet asserting anything, just stating what the source said; I’ll hold my personal comments until after the whole thing. Here is that report:


What actually happened with The Odd Gentlemen

The biggest reason there’s an NDA in place about The Odd Gentlemen’s involvement is that Andrew wanted to cover up the fact that much of the blame is on Andrew’s failure to deliver a workable plan to the studio in the agreed-upon schedule.

While parts of the ipgd post are true, the post distorts what happened into a story designed to make Andrew look like he did no wrong. What actually happened is this:

⚖ Tweets about the attack on the Capitol

Twitter is an ephemeral medium. You scroll through tweets just fast enough for them to register in your head, and then they’re gone forever. If you want to find something again, you can go to somebody’s profile and scroll through, one tweet at a time, until you find what you wanted.

This is a lousy way of capturing history. That’s not great, because Twitter does such a good job of capturing important moments, as they happen. If you want to save that moment, though, what can you do? What do you do if you think a day’s tweets are important? Print them out?

Well, I did. Here is what I tweeted and retweeted, on a page. Tactile. To be read.

📣 Why Act 6 Hits Different

  • Posted in fandom

One of the reasons Homestuck was so popular is how contemporary it was to internet culture. You tell anyone that Homestuck is heavily influenced by internet culture and they’ll nod and agree and you’ll both be very intelligent media critics. But somehow, even from that same group, you’ll see people who notice how the writing style of Homestuck changes over its nine year run and forget about contemporary culture entirely, which is a mistake.

Andrew Hussie has always spoken (or tried to speak) in an aggressively contemporary voice. What he wrote in 2008 sounds like it was written for the internet in 2008, with all the charm and all the baggage. Homestuck began in 2009. Remember internet culture from 2009? “R*tard” was still an acceptable insult back then (among the dominant cultural groups that made up internet forums, at least). Going back as an archive reader in 202X, though, reading “the r slur” in casual conversation is jarring. Why is that there? That shouldn’t be there.

The comic that Andrew wrote immediately predating MSPA was called “Team Special Olympics”, and that’s a whole conversation, let me tell you. In MSPA proper, Andrew was happy to make running jokes about racial diversity or gay pornography in an uncritical, unsatirical way. This was the internet culture Andrew’s comics were deeply immersed in.

Rather than stay fixed in 2009, MSPA — and Homestuck in particular — continued to mirror contemporary (read: pop) culture as it went on, which caused natural shifts in the material. What were previously wacky domestic antics played up for laughs became serious issues of domestic abuse, in retrospect. As readers revisited the earlier material, they re-evaluated it through a more mature cultural lens. Because of the serial nature of the comic, this worked out very naturally: as Andrew and the fandom grew, Andrew wrote in-characters realizing that abusive behaviour was concerning, just as actual abuse victims do. It felt like a natural progression of the story and characterization, because it was natural; it was the same dynamic that really was playing out irl.

This effect had a noticeable impact on the tone of the comic. 13 year boys who insultingly called each other “gay” as playful insults — or prefaced their interactions with “no homo” clauses — would become very different characters in 2015. Sexuality isn’t a insult now, it’s a character arc. Disabled characters, too, were originally played for laughs, but later got real character arcs about their disabilities as they related to their identities in a way that treated the issue (semi)seriously.

All this change — what Sarah Zedig calls its “maturation away from its at times uncomfortable edginess” — can sometimes rub old homestuck fans who liked everything about the atmosphere of the 2000s the wrong way. It can feel like the second half of Homestuck is “subverting” the story they knew and loved, because, well, it’s different. In back corners of the internet you’ll hear that Homestuck was somehow “taken over by sjws” or even conspiracy theories that later parts of homestuck were ghostwritten by another author entirely. On the other side of the room, you’ll have people who read Homestuck, see how it develops well-written gay, trans, and non-binary1 main characters in its later half, and treat the full body of Homestuck as thoughtful queer fiction.

Neither of these is quite right. Both forget how long Homestuck was a serial work, and how much the contemporary culture it mirrored changed over its run. Homestuck re-framed earlier events as its fans themselves re-contextualized them in a changing world. Likewise, Homestuck engaged with queer topics only as and because they became a topic of conversation online. Andrew’s writing reflected the culture of the internet as it happened, and reading it as an archive work invokes all those difficulties with it.

When people describe Homestuck now, they might mention that the first part is “dated”, due to contemporary references, slurs, insensitivity, and the like. But that forgets that Homestuck intentionally, extremely, unavoidably a product of its time, and the internet culture that gives it its charm is the same thing that can leave a bad taste in peoples’ mouths.


⚙ ACNH Printer - a writeup!

  • Posted in dev

This is a writeup of a project I did in April but never released. Well, I’ve definitely released it now, if you want to give it a try!

Instead of a real introduction, here’s a video demo, with camcorder LP technology from 2005:

I am not going to buy a capture card

Ever since Wild World, Animal Crossing has had a pattern system, where players can design their own textures and use them as clothes or decoration. New Horizons has one, but since it doesn’t have a stylus you have to either use the directional pad to mark individual pixels or draw with your fingertip.

I thought it would be fun to find a way to automate that. Now, granted, it takes a while, but it’s still much faster than trying to copy pixels over by hand.

📣 The Hiveswap Fiasco

  • Posted in fandom

The real story of Hiveswap isn’t about the game or the universe. Rather, the conversation “about Hiveswap” is dominated by stories about the development and history of the game as a project — starting as a Kickstarter success story but then bouncing from scandal to scandal for years. The story of how Andrew Hussie burned through a $2.5 million dollar investment over eight years to produce almost nothing is fascinating, convoluted, and poorly understood even among Homestuck fans.

Right now, this meta-story mostly exists in the form of oral history. This is probably due to the fact that a lot of the key sources are ephemeral — and most of them have been deleted — but it’s also because it feels premature to write up a “postmortem” on a game’s development before it’s even an eighth of the way finished.

I’m documenting the story so far so that the Hiveswap Story isn’t lost to time, and so there’s a decent summary of events so far, and maybe even so new Hiveswap fans can catch up. I dug through every page, announcement, interview, blog post, FAQ, and tweet I could find, and the culmination is this the most comprehensive — as far as I can tell — explanation of Hiveswap to date.

⚖ How Apple destroyed mobile freeware

I have a memory from when I was very young of my dad doing the finances. He would sit in his office with a computer on one side and an old-fashioned adding machine on the desk. While he worked on the spreadsheet on the computer, he would use the adding machine for quick calculations.

Adding machine

A year or two ago I had a very similar experience. I walked upstairs to the office and there he was, at the same desk, spreadsheet on one side and calculator on the other. Except it was 2020, and he had long ago replaced the adding machine with an iPad. There was really one noticeable difference between the iPad and the old adding machine: the iPad was awful at the job. My dad was using some random calculator app that was an awkwardly scaled iPhone app with an ugly flashing banner add at the bottom.

⚙ Tabs or Spaces?

  • Posted in dev

“Tabs or spaces” is one of these age-old computer science preference issues (like whether you use Vim or Emacs1) that gives people a binary preference they get to pick and then get very attached to, due more to sunk costs and personal identity than anything else. (Good thing that only happens with unimportant stuff.)

I was thinking about this the other day, and I realized that I have an opinion about this, but it’s actually the opposite of what I do. And it’s not because of filesize, or encoding, or anything like that.