In memoriam [CG]VonRickRoll

Posted on 2020-08-15

I published a proof-of-concept pseudo-game. But first, let’s talk about how I got there.

How many of you remember [CG]VonRickRoll? He’s the former CG intern who was tasked with converting the previous IRC-based webchat to the current XMPP one. He’s also to blame for getting me to start contributing puzzles to the pool: before that I was mostly known for assisting other creators with reviews, suggestions and opinions. And sometimes for approving their brainchild.

Back then

The environment was quite different back then. There were only four contribution categories, and they’re probably not what you think if you weren’t around at the time it changed:

  • short clash (5 minutes)
  • medium clash (10 minutes)
  • long clash (15 minutes)
  • community puzzle

There was no XP for moderating puzzles either, and the atmosphere was much more positive than it is today. To expand: rejection didn’t really happen, ever. That word was just a label in the interface, a button nobody clicked on. Bad puzzles would simply linger until someone stood up to improve them. Sometimes that someone would be the author. For trivial improvements, drive-by contributing moderators such as myself could boldly step in. For deeper improvements, some interaction with the author would be preferred. In extreme cases such as the author’s complete departure from the platform, we’d convene in the comments section and find a way to salvage it through.

Times have changed.

VRR left. The webchat remains unmaintained to date, with long standing bugs: recurring heavy lag periods, crashes and restarts, many remaining protocol deficiencies, obsolete transient public channels piling up, and a massive amount of spoiled bandwidth1. Sometimes an admin would compassionately end the pain and recycle the server before it crashed instead of after.

A team of chatops was picked up. With some good choices—who doesn’t love Bob or player_one?—, some neutral yet useless choices—those we never saw—, and also some very weird choices—an overconfident narcissist, a repeat channel rules’ offender. Updated a few times behind closed doors, with quite persistent the sampling. And yet periods of unguarded chat time. But hey, chat lives on.

The chat lives!

Long-duration clashes had a much lower success rate than the others, so they skimmed them out of the pool and converted them to community puzzles. They merged the two remaining clash difficulties into one. Later on, community puzzles disappeared as a separate puzzle category, and were fanned out to the easy, medium, hard and very hard categories2. That behave like easy, medium, hard and very hard puzzles in every way but the fact they only award 50 XP.

Clash and puzzle moderation gradually degraded. No consistent categorization policy was ever put together by TPTB, so the self-appointed moderators started making one up and stuck to it. Individually. As in, each with their own. Or their faction gang’s. With more heavy-handed rejection, at quite some cost to the human aspect of the interaction.3 Moderation actions started awarding XP and triggering site-wide notifications, in order to alleviate other moderators’ burden of thinking on their own when rushing to claim said XP before it vanished to someone else.

“This is a clash, not a puzzle!”
What makes you think that? Also, why couldn’t it be both?
“This is a puzzle, not a clash!”
“This clash is too easy!”
Yet expert clashes came to be split out.
“I reject because this is impossible for a reverse clash.”
…instead of editing out reverse mode.
“This is too easy to be a puzzle!”
Disregarding Onboarding, have you tried the Descent?
“This is too easy to be a medium puzzle!”
Well… Stock Exchange Losses has a long name, so it’s got to be hard, but there’s still Scrabble.
“…to be hard then?”
Super Computer and the Resistance (very hard) beg to differ.
“I reject because there’s a typo.”
…instead of editing it out.
“I reject because this part of the statement is not clear.”
…instead of editing it or prompting the author to.
“I reject because the author isn’t responsive.”
“…on my timescale.”
“I reject because the author isn’t responsive on an absolute timescale.”
“…because I don’t want anybody else to see it, god forbid improve it until then.”
“I approve because I like Pokémon/chess/chocolate.”
“Haven’t actually tried it tho.”
“I reject because the solution is a one-liner.”
But the process to reach said one-liner could be very difficult!
“I approve because I have a solution that works.”
Yet both the statement and the author’s solution are wrong. You could actually have noticed it on your own if you had actually tried to solve it, instead of translating the author’s solution.
“I reject because it’s a duplicate!”
…instead of giving the author a chance to make it differ.
“The stub is wrong for”
“…and there’s nothing the author can do about it.”
“I reject because the statement could be better!”
“…and we wouldn’t want the author to claim XP from something merely good.”

Fight in the gaulish village

Many of those stem from the misguided4 framing that clashes should be of the same nature as puzzles, and that both can be partitioned by difficulty rating. That is not the case.5

But I digress.

It took a lot of moaning, whining and pressuring, and CG opened up its game interface at last. I rejoiced a lot at the news. I had been waiting for a way to work around the I/O puzzles’ limitations for a very long time. So I was pretty disheartened when I actually got around to sparing the time to try it out: full deeply integrated Java with no way out, and I hadn’t hoarded just that much time to get re-acquainted with the ecosystem.

I did reach that point, though, eventually.

The experience thus far is a melting pot of mixed feelings. The game’s reception was great. My style resonates with a lot of people, and some were even nice enough to tell me about it. Or even contribute! But the SDK is still full of bugs. Honestly, I was very surprised to come to discover so many of them so late in the game as an SDK user. And the CG bugtracker interface is hugely nerve-wracking. It’s reached the point where I’ll finish TVC first, then maybe report the bugs later.6 As a silver lining, struct and Illedan were quite helpful, kudos to them, though really little by the well of SDK knowledge that is eulerscheZahl. All glory to our toad! He had prior information in response to most of my queries, and saved me a lot of trial and error along the game system’s dead ends. I only wish he had a greater uptime.

TVC’s not so close to being complete. But it’s still time for me to give back to the community.


In the lineage of eulerscheZahl’s 3D teapot demo, I’m offering my own take at slowly pushing the limits as to what an HTML5 viewer could be. (Now’s a good time to check it out, if you haven’t already.) Here are a few takeaways.

Media objects: surprisingly, those were the hardest to achieve. The publication interface restricts the provided package sizes to 15 MiB.7 I was aiming for maximal portability, so I had to provide two encoding variants. Sidestepping downscaling, extracting the best sources I could find and remuxing them. Because a game package should be self-contained, and not risk exposing the user to third-party tracking.

Asset addressing: I couldn’t find this documented anywhere. Viewer assets go through some machinery at publication time, and are renamed in the process. I assume they’re hashed to de-duplicate and save space on the edge static content server. To access them from the frontend code, the word on the street was to publish once, find out their hashes through whatever means, then reference them by hash and republish.

My humble contribution was to sourcedive in the game loader and extract the following tidbit for all to see:

import { assets } from './assets.js';
var assetsBase = assets.baseUrl ? assets.baseUrl : '';
var assetUri = assetsBase + assets.images['file.ext']

Asset hashes are available from Javascript as the images array in the assets object from the ./assets.js module, with the original file names as keys. Regardless of their actual MIME type.

Forward thoughts: we’d all like to get rid of that PIXI leech that’s hogging the CPU and RAM. EulerscheZahl has paved the way with the clean-the-slate-by-hand approach. It’s a simple matter of time before we blast the gate open and have actual control of the viewer. Likely with more HTML5. Possibly web assembly too.

I can’t wait.


  1. I’ll write up on this eventually.↩︎

  2. With debatable categorizing success.↩︎

  3. Some of the most heavy-handed rejecters have never published anything. Not that it proves anything, it’s just noticeable.↩︎

  4. IMHO↩︎

  5. I’ll write up on this too, eventually.↩︎

  6. And writeup. Later.↩︎

  7. Or is was it 10? Anyway, it’s yet another of those pesky annoyances you discover along the way because there’s no prior warning for that either.↩︎