A person who trusts can never be betrayed; only mistaken. -- Auronar Proverb

Fiction: Winnie the Pooh and Geocaching As Well

The other night, my daughter asked me to tell her a story. I made her do the heavy lifting. Here, after some editing, is the first part of what we came up with.


In Which a Visitor comes to the Hundred Acre Wood to teach Winnie-the-Pooh about Geode Catching

Evelyn and Red Zoomer
She tells me she would’ve needed to call it something else had it been slow.

Quite a long time ago – it may have been last Sunday or perhaps even Saturday – there was a little girl named Evelyn. And once day, Evelyn decided to go on a Scooter Walk. So she got her scooter, which she had named “Red Zoomer” on account of it was very fast, and also red, and she set off for the Hundred Acre Wood. By and by, Evelyn came to a house in the forest with the name “Sanders” written over the door in large gold letters. Now, of course, Evelyn could read very well, so long as she limited herself to sight words like “is” and “as” and “the”. But “Sanders” was a different matter entirely. But she gave the matter a little think, and it occurred to her that she certainly couldn’t read the name “Sanders”, and she couldn’t read the name written over the door, so, logically, that meant that the name over the door must be “Sanders”, which meant that Winnie-the-Pooh lived under it. And so it was.

Evelyn had always wanted to meet Winnie-the-Pooh, of course. Her brother Dylan had once told her all about the dangers of entering a bear’s house uninvited, so she knocked firmly on the door.

Winnie the Pooh Lived Under the name of Sanders

Winnie-the-Pooh had just finished his mid-morning snack, and had been preparing for his late-morning snack when he heard the knocking. As it was quite an unusual time for a visitor, he called out, in a cautious voice, “Who’s there? Are you a friend?”

“Someone’s friend in particular, or just generally sociable?” Evelyn answered. Because she always tried to be a friend, but on odd occasions she had been know to bite someone, particularly if they wouldn’t share the crayons. But never hard enough to leave marks.

“Are you a friend of Pooh Bear?” asked Pooh, though he was starting to develop his own suspicions.

“You’ll have to ask him,” Evelyn called back. “We haven’t met yet.”

Pooh rested his head against his paw and thought about this. And for a bear of very little brain, this was a difficult question. Now, the way Pooh saw it, it was generally best for someone to be a friend, because friends tended to say very friendly things like, “Would you care for a small smackerel of honey?” So he nodded to himself and called out, “Then I suppose you had better be,” and flung open the door.

“I’m Evelyn,” Evelyn said, by way of introduction. “And this is my scooter, Red Zoomer.”

“Ah,” said Pooh. “You must be my very good friend Evelyn.” He leaned in conspiratorially and whispered, “Is Red Zoomer a friend as well?”

“Oh yes,” said Evelyn, “Red Zoomer is a very good friend who hardly ever topples over and drops me on my face.”

“Well that’s all right then,” said Winnie-the-Pooh. “What brings you to the Hundred Acre Wood today?” asked Bear. “I don’t suppose you came to invite someone to lunch?”

Evelyn laughed. “Actually, I came here to go on an Expotition. I know you are very famous for your Expotition to find the North Pole, and thought you would like to go with me.”

Winnie-the-Pooh was always pleased when someone remembered his discovery of the North Pole, and so he almost agreed immediately, but it occurred to him first to ask, “Will this Expotition be searching for any of the fiercer animals, such as Jagulars or Woozles?” Because while Pooh was quite obviously the bravest bear in the Hundred Acre Wood, he shuddered to think what one of the fiercer animals might do to his new friend Evelyn. To say nothing of Red Zoomer.

Once again, Evelyn just laughed, “Silly old bear. This Expotition is to find Treasure.” And she said it just like that, with a capital letter and everything. She quite likely would have said it in italics as well, but being a very small child, she couldn’t stretch her fingers far enough to press control-I.

“I see,” Pooh thought. “Would this treasure happen to be of the edible sort?”

“Possibly,” Evelyn said. “You never can tell with geocaches.”

Bear considered this. “Begging your pardon,” he asked, “But what exactly is a Geode Catch?”

“It’s a treasure,” Evelyn said, carelessly. “You follow a map to find it.”

“And how quickly does the map move? Will we have to run?”

Evelyn showed Pooh her phone. Or rather, the phone she had borrowed from her daddy. “This is a map,” she explained. “The X shows us where the treasure is.”

“So we look for the X?” asked Bear.

“We look for the spot,” Evelyn said. “The X shows us where the spot is.”

“Will the X be joining us here, or will we meet it along the way?”

“Silly old bear,” Evelyn said. “Come on. You should bring some treasure too.”

Now, Pooh was confused. More confused. “I thought we were finding treasure at the spot.”

“Yes, but if we take the treasure, we should leave something else for the next person to find,” Evelyn said.

So Pooh reluctantly collected one of his smaller honeypots, and then Pooh Bear and Evelyn and Red Zoomer set out to follow the map to find the spot. Evelyn made a grand production of directing the Expotition this way and that, past the six pine trees, then south toward the little spinney where Pooh had once failed to catch a Woozle, and over the river, stopping only long enough for a single game of Pooh Sticks. And as they walked, Pooh thought of a little hum about their Expotition:

Bear and Girl set out one day,
They went for a walk in a usual way,
What did they seek? A Geode Catch.
Where will they find it? A wooded patch.
Over and under and around and through,
Went Girl and Bear. Oh, and Red Zoomer too.

At long last, Evelyn and Pooh came to a shady spot, not far from the North Pole. “Aha!” Evelyn declared. “This is the spot.”

“I don’t see a spot,” said Pooh. “I don’t even see an X.”

Evelyn pointed to the map. “The map says that we must search.” And so they did. Evelyn immediately started looking underneath leaves and up trees and between blades of grass. Pooh walked around in circles several times, and then searched inside his footprints. But after several minutes, he had found neither spot nor X, and so he sat down beside a fallen log to have a think. And as the ground was rather uneven, he set his small honeypot in a knot-hole in the log to hold it steady.

A geocache
Picture for demonstration purposes only

“Now,” said Winnie-the-Pooh, “I always think better when I have had a small something.” So he reached for his honeypot inside the knot-hole on the log. To his very great surprise, however, what he found was an entirely different jar.

He studied it carefully. “There is something very unusual about this knot-hole,” he said. After a moment of panic, he looked again, and found his own honeypot still safely tucked in the hole beside the other jar. “Perhaps,” he thought, “This is the sort of knot-hole that often contains two honey jars.” And so he opened the new jar. “Oh bother,” he said. “No honey.”

“Pooh!” Evelyn exclaimed, “You’ve found the treasure!”

“Have I?” asked Pooh. “I thought it was a jar.”

“It is a jar,” Evelyn said. “The treasure is inside.” She showed Pooh how inside the jar was a tiny book and a collection of small baubles. Pooh found that among the things inside was a very nice pencil eraser. Pooh, of course, had very little use for a pencil eraser, but this one happened to have his own face printed on it.

Winnie the Pooh erasers
Evelyn came up with this all by herself. It seemed likely that such a thing existed, but I’m not aware of either of us having seen one before.

“What a lovely eraser,” Pooh said. “It looks almost like it was made for me.”

“Maybe it was,” Evelyn said. “Maybe someone put it there hoping you would be the one to find it. You can have it if you like,” she said, “If you have something to leave in its place.”

To Pooh’s very great relief, it was plainly obvious that even the smallest of honeypots would not fit inside the jar. But as it happened, the previous day, Pooh had found a very pretty stone by the edge of the stream, and as luck would have it, he was carrying it with him that day. Evelyn agreed that a pretty stone would be a suitable sort of thing to leave as a treasure. So Pooh deposited his stone in the jar, and in return, he took the eraser. Then Evelyn showed him how they were supposed to write their names in the little book to let everyone know they had found the treasure. First, she wrote her name, “EƲ3LŲN”. Then she helped Pooh write his name. Evelyn did not know how to spell “Pooh”, and Pooh himself only had a very general notion of it, so they wrote “P.B.” for Pooh Bear, and left it at that. After, they closed up the jar and tucked it back inside the knot hole.

“Did you have a good Expotition, Pooh?” Evelyn asked.

“Oh yes,” answered Bear. “I so wish my friends could learn all about Geode Catching as well.”

“Well maybe they will,” Evelyn said. “Now, I’m getting kind of hungry. Let’s go have a small smackerel.”

And so they did.

Ross Plays! Page 4 of the Bundle for Racial Justice and Equality

By the way, there’s a new massive bundle out there, this one for Palestinian aid. Wherever you come down on that part of the world, there’s never been an armed conflict in history that didn’t hurt a bunch of people who didn’t deserve it, so if you’re so inclined and all. It has a lot of overlap with the previous huge bundle, but there’s some new stuff in there too.

  • For the Honor – PnP RPG involving princesses.
  • Hello Charlotte, Metamorphabet – No Linux Ports
  • Super Rad Raygun – A Mega Man-inspired platformer with a Gameboy visual flavor and an over-the-top Reagan-era backdrop (You play a Chibi B-MO-ish robot-human hybrid built to fight communists despite being the product of massive OSHA violations). It ran well, but the config tools don’t have a linux port, so I played through the first level with key mappings that are completely unusable for a southpaw (WASD to move, VGBY for buttons) and only worked out how to remap them by trial and error.
  • Fortune 499 – No Linux port. Looks like neat retro-style RPG.
  • Heroic Asset Series: Overworld – A 16×16 sprite pack for making Zelda-likes
  • This Discord Has Ghosts in it – Seems to be a collaborative game played via Discord? Not really ready for something like that today.
  • 10S – A retro-styled action game whose gameplay is modeled on tennis. No Linux port.
  • My Friend Took Me To A Feline Therapy Place For My Anxiety And I’m Starting To Wonder Where The Cats Are? – This is a book. A novel about… Well, it’s all there on the tin, really. It’s very sweet and wholesome.
  • Quadrilateral Cowboy – This one is really neat and I can play it to boot. It’s a cyberpunk heist game set in a world that seems to mix Christie-time and Cyberpunk motifs, with a medium-low poly look where characters all look strange and blocky – at first I thought it was Minecraft style, but it’s not really. My only complaint is that it’s one of those games that lean in on the “awkward controls” thing. You know, where you interact with the world mostly by clumsily batting things around like your hands are made of rock.
  • Blind Men – Um. Gay anime supervillain romance visual novel? I clicked through about ten minutes of dialogue before I lost interest. It had pretty much lost me when the beautiful bishie boy with the sexy eyepatch laments his hideous disfiguration.
  • Sewer Rave – I… Um… I have no idea. It’s a raycasting low-rez-style game set in a surrealist dance party held by rats in a sewer? I don’t think there’s anything coherent to it, just a bit of a synesthesia thing? I don’t know. I’m uncomfortable.
  • HPS Cartography Kit – A tileset for a hex maps. Is this the first RPG asset pack for tabletop gaming we’ve had so far? I can’t remember.
  • SAI – An action game about deforestation? Windows-only, but it’s also been made free so you can try this one even if you didn’t snag the bundle. The screenshots look lovely.
  • OneShot – Big winner here. Sort of JRPG-flavored game with a heavy meta-element reminiscent of Undertale. You play as… Well, no; the player character is a sort of catboy trying to save a dying world of robots, but you don’t play “as” him; you play as you; the game addresses you by name (It didn’t ask me my name. It just knew. Which means that, despite, again, me using an operating system that The Man disapproves of, it looked up profile information. It didn’t even call my by my linux username; it actually looked up the “Real Name” I put in when I installed the OS. Which is not a very normal Linux thing to do. Also, I prefer to play games in windowed mode rather than fullscreen (I know I’m weird), and this is the first game that’s actively agreed with me about that – its intro text says that it’s better to play it in a window. And it used this to great effect, sometimes interjecting comments to the player not via the game’s UI, but via an OS dialog box (The dialog boxes are not quite perfect; there’s some broken icons that I think stem from it using a deprecated API).
  • GNOG – Very disappointed that this has no Linux port as it bills itself as a collection of puzzle boxes, and that’s right up my alley. TBH, I think an android port would be even more apropos.
  • Drum Brain – This is an interface for rhythm game instrument controllers, which would make it a miss for me even if it ran in Linux.
  • The Fall of Lazarus – A science-fiction mystery game that looks pretty interesting and which, again, I can’t play because it’s Windows-only.
  • Multi-Platformer Tileset – What it says on the tin. Retro-styled assets for platformers, looks to have taken some inspiration from Ghost’n’Goblins maybe? It’s a little bit Castlevania, but with a softer edge. Actually reminds me a lot of Faxanadu, but that’s not a game I imagine inspiring a lot of artists directly.
  • Bleed 2 – This is a stylish arcade-style action game. It looks great and plays well, and is just not my kind of thing. Gameplay is like a 2-D platformer, except that you use the mouse to aim and shoot while doing platforming via the keyboard and it is all too damn much. Also, the Linux release comes as a binary installer. An executable program you run which asks you where to install it, and then it does. This is not a linux thing and it made me uncomfortable.
  • Voyageur – A bit of an Oregon Trail in space, but a more forgiving one. You wander the galaxy on a forward-only journey (for technobabble reasons, you can only ever travel in the general direction of the galactic center), pick up crew, refit your ship, trade resources, foment revolution. It’s a thoughtful, slow-paced game that I found myself idling away a pleasant hour on. It feels like one of those games based around hidden mechanics, where you’re supposed to spend a lot of effort figuring out exactly what sorts of planets are optimal for what sorts of activities, and buying low and selling high, and that usually gets tedious for me, but the game is very forgiving so far, and with a cargo capacity of 4 and no ability to backtrack, it pretty much has to be, and you can’t really afford to hold out for an arid planet to sell your moist foodstuffs. Also, the best profits are on art objects, and those are unpredictable. Some graphical glitches in linux. Nothing show-stopping; the game is menu-driven so you’re not going to screw up due to some flickering, but it’s visually unpleasant when it gets bad. Annoyingly, the visual glitches seem to go away if I run it in windowed mode, but you’re limited to two specific window sizes neither of which is a good fit for my actual physical screen.
  • A Normal Lost Phone – It’s getting to be a trend with these indie games where about three minutes in, you realize that you’re reading a coming out story and the only real question is which flavor. This is a “You found someone’s lost phone and work out their story by reading their text messages” game. Not nearly so dark as Sam is Missing. Huh. Another lost phone game about a character named Sam. Weird. Also the barest hints of The Missing, and Secret Little Haven (If you understand these references, you know the answer to what kind of coming out story this is). Anyway, it’s fairly good. The main method for gating gameplay is via passwords, so there’s a lot of “Now go back through hundreds of messages to figure out which birthday/zip code Sam associates with this account (Though there’s one puzzle where they change it up and that’s pretty great). Fortunately, the game is fairly short, though it’s heavily frontloaded with “Read hundreds of texts before you get a sense of what you should be doing.” The bigger problem is that Sam’s narrative voice doesn’t come through all that strongly until the very end, so I didn’t feel connected to the feelings of oppression and alienation that motivates the plot. The ending is more uplifting than I expected; I spent a long time bracing myself for the reveal that Sam had died in a motorcycle crash.
  • Speed Dating for Ghosts – Another game I’m sorry to miss out on because of the lack of Linux or Android ports. Sort of a cute visual novel/CYOA thing with art that’s somewhere between Edward Gorey and Maurice Sendak.
  • Underhero – A fun Metroidvania with a bunch of twists. First things first, you start out as an invincible hero near the end of his journey… But then a low-level minion drops a chandelier on you. This is the second game so far that’s started off with the chosen hero of destiny getting trivially murdered in the opening scene. It blends in elements of Skyward Sword in the form of the hero’s chatty magic weapon which conscripts the minion into completing the hero’s quest, though they’ll need to re-empower the magic weapon while carrying out the evil overlord’s assignments. The battle system is more similar to Paper Mario than any Metroidvania, though, switching to a strategic ATB-like system where the player and the enemy exchange blows based on timing and a stamina meter.
  • Throw Cubes into Brick Towers to Collapse Them – With a name like this, I really wish I had played it and come back to tell you that this is a misleading title and it’s actually a philosophical deconstruction of identity and capitalism. But it’s Windows-only, so I can’t.
  • Pixel Art Medieval Fantasy Characters Pack – Asset pack in the retro-modern style that’s a little smoother and cleaner than a legit retro-style. Reminds me a little of Shovel Knight, maybe.
  • Imperishable Memories – A Gradius-style shooter with hand-drawn graphics and a storyline I… didn’t really pay enough attention to. Not my thing. I had to install a bunch of 32-bit dependencies for this to work, and unhelpfully, the game will start but not work if they’re missing.
  • The Floor is Jelly – A platformer whose gimmick is that the platforms are non-Newtonian fluids. I don’t find the art compelling, but the concept is. But, again, no linux port.
  • Ech0 – A tabletop RPG based around map-drawing with the broad concept of “Kids playing in the wreckage of a giant robot”.
  • Brassica: A Marry Tale – We end page 4 on another of the bundle’s favorite genres: gay romance visual novel. The setup reminds me a bit of The Royal Trap – looks like it’s setting up a dating sim in a fantasy-medieval kingdom, only queer. The first few minutes of text did not catch me, and there’s a languidness to the transitions that made it feel slower than it was.

No One’s Backstory’s As Tragically Sympathetic Like…

So now that Cruella is out, we have to face up to it. Some people I think have hit it on the nose by saying that the thing that makes this one hard to swallow is that the Evil Queen is a fantasy-medieval character sorceress, and Maleficent is a fay, and Ursula is a supernatural creature, but Cruella is just, like, a rich person from the 20th century, and that’s too close to us. But anyway, one of the hot takes I see a lot in light of this is, “Just wait, their next live action prequel will be the story of a boy in 18th century France struggling to survive and overcome after his parents are murdered by the abstract concepts of literacy and female agency.”

So…

Gaston
No one clicks to view at full size like Gaston

The Politics of Zodak

There’s something that I think progressives misunderstand in the struggle for voting rights. They’re not wrong about their own position, but by failing to understand their opposition, they’re putting themselves at a disadvantage in winning the argument.

See, it is rightfully curious that so many conservatives can, with a straight face, insist that it is bad for democracy to ensure that people be able to vote – that it is more democratic to reduce the franchise, and that elections where more of the population vote are inherently unfair, illegitimate, or “rigged”. For the most part, I think progressives assume this is simply down to conservatives being lying sacks of shit who want to win by hook or by crook. And certainly that does describe a politically powerful segment of the current elected and, ahem, emeritus leadership of the Republican party, I don’t think it properly accounts for the opposition.

Frankly, I think you’ve got maybe 25%-30% of the Republican party who just outright believes that they should win every election by hook or by crook and elections be damned. And if you find that number insulting, remember, 27% on a survey is basically the “crazification factor”. There is no statement so completely inane, insane, outrageous or wrong that 27% of respondents won’t earnestly agree with it.

The trouble is that on top of that 30%, there’s another 30% who are wrong in a subtle broken-computer-in-a-60s-sci-fi-story sort of way. And it’s a hard kind of wrong to disillusion them about. To wit, they don’t know what “fair” means.

These are the people who will tell you that weather forecasts are inherently bullshit because “There’s always a 50% chance of rain: either it will rain or it won’t.” Because… Well, because they learned probability in middle school from a teacher who didn’t like math and haven’t given it a lot of thought since. Their mental model of what “fair” means is “like a coin-toss”. They have no other understanding of the concept of fairness. So they’ve internalized a notion that any time there are two options, “fairness” dictates that one option is chosen half the time, and the other option the other half. They like the idea of different parties controlling the White House and the legislature. They like the idea of alternating between Republican and Democratic presidents. They think that’s “fair”. And so, if they think that getting everyone to vote will cause one side to win way more than the other, in their mind, that is unfair completely regardless of the reason. Even if the reason is, “Because way more people want the Democrats in power,” that doesn’t change the fact that their notion of “fair” requires a near-equal divide of power between the parties, and thus more people voting is less “fair”.

I’ve had people tell me, on the issue of DC statehood, that it is reason enough to oppose it that it would create an extra blue state without creating a red state – they seem to believe that there is a requirement that states be added in red-blue pairs. Never mind that the current numerical distribution of states isn’t even. If we want things to be “fair”, it has to be a coin-toss.

And this attitude is not limited to Republicans, but the Republican leadership understands it and knows how to exploit it; the Democratic leadership doesn’t. So the Republicans say, “We want to gerrymander the districts so that each side will consistently get about* 50% of the seats,” and their audience says “Well that sounds fair.” The Democrats say, “We will balance the congressional districts so that they accurately reflect the 60-40 split in the population,” and the audience is outraged that the Democrats are trying a power grab to ensure they get 60% of the seats rather than the 50% which fairness dictates. (Hey, what’s that asterisk? Nothing, nothing. Well, it’s “When we say ‘about 50%’ we mean ‘We will consistently get 51-60, they will consistently get 40-49’,” but never mind that)

And the more the Democratic leadership says, “We just want it to reflect the actual distribution of poltical views,” the more both sides hear, “We’re not happy with a roughly-50-50-split and want more.”

This notion that fairness requires an equal probability of victory might sound strange given how closely it approaches the idea of “If the Republicans don’t have a majority of the people on their side, we should give them subsidies Affirmative Action From Each According to his Means To Each According to his Needs an advantage to make it fair.” But that’s not how they see it. Of course it isn’t.

But maybe it could be?


The title of this article is a reference to a character from He-Man and the Masters of the Universe. Due to the slipshod ’80s toyetic “We don’t give a crap about continuity, just sell the toys,” nature of the franchise, there was some confusion between different parts of the franchise whether the character of Zodak was a hero or a villain (I think it was originally just because he had clawed feet). Also whether it was “Zodak” or “Zodac”. As the franchise settled down and tried to wrangle some kind of continuity out of this weird-ass Conan rip-off, they settled on the explanation that while Zodak might be personally sympathetic to the side of good, his official loyalty was to the balance between good and evil, and thus he was duty-bound to help out whichever side was losing. Which was usually the bad guys, because He-Man villains were, for the most part, incredibly stupid.

This is definitely going to hurt my google pagerank

You ever hear the grammatical oddity, “Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo”? A grammatically correct and logically coherent sentence that is incredibly confusing and hard to parse and only has the one word in it over and over?

Turns out there’s another word you can do this with. I present to you, a sentence which means “[This is bad]: [low quality] [feces] (that) [low quality] [people of poor character] [defecated] [for the purpose of causing trouble] (themselves) [emit in an uncontrolled manner] [low quality] [substances of an unspecified unpleasant nature].”:

Shit: shit shit shit shit shitshit shit shit shit.

Collective nouns are in blue
Adjectives are in red
Verbs are in purple
Adverbs are in green
Exclamations are in black

 

 

Ross Codes: Pathological Switches

Some years ago, a then-colleague described me as “A Developer with a big D,” Which he quickly corrected to a capital D. Anyway, today I’d like to tell you about how C is insane.

So, an idiom not uncommon in the C programming language is the “switch” statement. It looks like this:

switch(x) {
case 1:	printf("Hello\n");
case 2: printf("World\n");
default: printf("Bye\n");
}

This all looks very sane and fine and if you were raised in the world of normal programming languages written in the 21st century by people who weren’t suspicious that the metric system was an agent of global communism, you might assume that what you’re looking at is just syntactic sugar and semantically, it’s the same as this:

if (x==1) printf("Hello\n");
else if (x==2) printf("World\n");
else printf("Bye\n");

Alas, you poor ignorant fool. If you know anything at all about C, you should know that C is not long on “syntactic sugar”. C does have, to my knowledge, one piece of completely pure syntactic sugar. And it is, of all things, the array index operator. Yeah. The array index operator is exactly literally the same as pointer addition. That is, a[b] means exactly the same thing as *(a+b). Which doesn’t sound like a big deal until you remember that addition is commutative, and consequentially, a[b] is the same as b[a]. Or worse, a[4] is the same as 4[a]. This is a good way to confuse someone with code. To make matters even worse, there’s reason to suspect that the reversed syntax was the original intention since in assembly language, the syntax [ax] means “Not ax itself; the memory cell whose address is currently in ax.”  No, a switch statement is actually a calculated GOTO. This isn’t a semantic control structure; it’s a jump table. One consequence of this is that it has to be able to resolve all the cases at compile-time. That is, this won’t work:

y=2;
switch(x) {
	case 1:	printf("Hello\n");
	case y: printf("World\n");
	default: printf("Bye\n");
}

Try that in gcc, and you’ll be told “case label does not reduce to an integer constant”. In other words, “I can’t be sure what ‘y’ is until the program is actually running, and it’s too late by then.” (In this little code snippet, you can indeed be sure. But this is C, so some other thread could be able to modify the value of y after that assignment, because C is like programming by sticking your hands into a big box of broken glass) So semantically, a switch statement is more like this:

if (x==1) goto case_1;
else if (x==2) goto case_2;
else goto case_d;
case_1: printf("Hello\n");
case_2: printf("World\n");
case_d: printf("Bye\n");

Only slightly more insane. Anyway, by now perhaps you have realized the thing that everyone donks up the first time they use the switch statement. If you run this code with x set to 1, it does the thing you told it to, but possibly not the thing you meant:

Hello
World
Bye

Yeah. It prints all three things. Because the code after the “case” label isn’t a block. The switch as a whole is. So execution just keeps going. To do the thing you probably meant, you actually want this:

else if (
switch(x) {
	case 1:	printf("Hello\n");
		break;
	case 2: printf("World\n");
		break;
	default: printf("Bye\n");
		break;
}

That last break isn’t strictly necessary, but it’s a good idea in case you add more code later. At this point, people coming from languages that were engineered by people not alive during the height of the popularity of LSD would probably say that this is dumb and it should just break automatically because clearly that’s what you meant. And loads of languages do this. They even allow freeform expressions in the cases so that it really is just a sugar coating over a series of if statements. Except, of course, this is C, and we wouldn’t give you a construct which was exactly as expressive as an if-else tree; the ability to fall-through isn’t a bug or an oversight; it’s the desired behavior. The reason for this, beyond a pathological hatred of first year computer science students, is that the switch statement’s “killer app” is not “Which of these should I do?” scenarios, but rather “How many of these should I do?”

for(x=0;x<5;x++) {
	printf("There was a farmer had a dog and Bingo was his name-o: ");
	switch(x) {
		case 0: printf("B");
		case 1: printf("I");
		case 2: printf("N");
		case 3: printf("G");
		case 4: printf("O");
	}
	printf(" and Bingo was his name-o.\n");
}

Yes, I can think of better implementations of the Bingo Algorithm. Shut up. My point is, the reason you use a switch and not a tree of if-then-else clauses is that you can treat the body of the switch as a big block that you can enter at various points depending on the combination o of things that need doing, which makes it very elegant for situations where there’s a multistep process you need to perform on some piece of input, but possibly your input already had the first few steps taken care of by someone else earlier.

But now, let’s go completely nuts… After all, a switch is just a structured goto, and the body is just a block. Which means…

switch(x) {
	case 1:	printf("Hello\n");
		if (y!=0) {
	case 2: printf("World\n");
		} else
	case 3: 
	break;
	printf("Surprise!\n");
	default: printf("Bye\n");
}

What? But yeah, C is fine with you doing this. So what happens? Madness.

X Y Output
1 0 Hello
1 Anything else Hello
World
Surprise!
Bye
2 Anything at all World
Surprise!
Bye
3 Anything (nothing)
Anything else Anything Bye

I need a drink. Yes, if x is 1 and y is nonzero, you can just ignore the switch altogether: Print “Hello”, then execute the if block, printing “World”, skip over the else block, and print “Surprise” and “Bye” because that’s what’s next. If y is zero, instead of executing the if, we execute the else, which skips us to the end of the switch. Okay. But now, if x is 2, we leap right straight into the middle of the IF. We don’t bother looking at y. We print “World”. We ignore the “else”, and that’s a little confusing if you are a normal, good-hearted person or even a Perl programmer, because how do you know what to do about the else? But it’s not that complicated: the close brace at the end of the “if” block is basically an invisible “Go to the next line after the else”. So we do that, which takes us to the line where we print “Surprise” and then “Bye”, helpfully labeled “default”.  If x is 3, now things get even stranger, because we jump in between the “else” and the “break”. But C, like a honey badger, don’t care. It’s just a line of code as far as the compiler’s concerned. So if x is 3, we jump right in front of a “break” and exit the switch without printing anything.

Does your brain hurt? Because notice that when x was 2, we fell through from the 2 case through the 3 case to get to the default case. The line that prints “Surprise” is clearly part of the 3 case, yet it can’t be reached in the 3 case.

It gets worse. Let’s go back to our first example and do something naughty:

switch(x) {
	case 1:	printf("Hello\n");
		int w[6];
	case 2: printf("World\n");
		printf("%d\n", sizeof(w));
	default: printf("Bye\n");
}

Now here, if you come from a reasonable sort of language like Perl, you’re troubled by this. If you come from Python, this might even wipe that smug smirk off your face, because even though Python doesn’t make you declare your variables, you probably get an uncomfortable tingle in your spine when you run into code where the scope of variables is nontrivial.

The scary thing, of course, is that if x is 2, you’ve jumped over the declaration of w. So does w even exist? Is w defined one way if x is 2 and you skip straight to case 2, but a different way if x is 1 and you fall through from case 1?

Don’t be ridiculous. This is C. “int w[6]” doesn’t really create anything. Here’s the assembly language emitted by the C compiler in-line between the two print statements:

[this space intentionally left blank]

You get a clue to what’s going on if you remove the first print statement. GCC will issue this error:

a label can only be part of a statement and a declaration is not a statement

Yeah. Declarations aren’t statements. They don’t compile into executable code. Instead, they’re instructions to the compiler about how it should arrange memory. “int w[6]” doesn’t mean “Go create a Thing which is an Array, having 6 cells for holding ints”. What it means is actually, “By the way, when creating the stack frame for this function, leave 6*sizeof(int) contiguous bytes there, which I will refer to as w.”

Being able to just shove in a variable declaration anywhere you like is a comparatively new addition to C. It wasn’t standard back when I learned this bullshit in undergrad a very long time ago. Used to be you could only do it at the beginning of a block. I’m not even sure that was ever standard, but GCC used to allow it. Originally originally, you could only do it at the start of a function. And that’s what’s going on here. That declaration is not an order to allocate memory; it’s part of the surrounding function‘s context. Mechanically, the “int w[6]: really “happens” back at the top of the function – that’s when the memory is allocated. Its placement within the switch statement is only defining its lexical scope – it’s telling the compiler which lines of source code are allowed to use the symbol “w” to refer to that block of memory; it has no meaning at run-time (You can prove this, if you like, by sticking a trivial variable assignment on either side, say “q=101; int w[6]; q=202;” and compiling with gcc’s “-S” option. Even if you can’t read assembly – and a C compiler’s output can be particularly irascible – you’ll be able to see the 101 and 202 on consecutive lines).

Well… Usually. Most of the time. Often. Because, of course, if you are an incredible dickwad, you can pull a stunt like this:

y+=10;
int z[y];

And now you’re boned. Because it can’t just go ahead and allocate that stack space as part of the function call, since it doesn’t know the value of y until runtime. If this were a sane language like Java, you’d just throw your hands up and say, “Actually no. Arrays shouldn’t live on the stack. w is really a reference to an array object which lives on the heap.” and C would laugh at you because that is nonsense and garbage collection is for hippies. That array has to live on the stack, because it has to have stack semantics. And the only way we can do that is if we embiggen the stack at runtime. If we do the same trick as before of emitting the assembly code, we’ll see that when you get to the place where we do the “int z[y]”, the assembly… Is a lot, really. The key thing happens all the way at the end, though, when it moves the stack pointer to accommodate the extra space, and then shoves a value into a local variable.

And here’s one thing that is subtle and different. It’s the one difference between a directly-declared non-variable-length local array and a pointer, and it’s a distinction that as far as I know, you can’t do anything with at the level of the C programming language. To wit: z is a local variable holding the memory address on the stack where the contiguous block of memory is. w is not. w is just the address of the contiguous memory block. When you access w[2], the code that’s emitted is, roughly, “add 2 * sizeof(int) to the constant value w. Add that to the base pointer, and look in that memory cell.” (Though it’s probably “subtract” rather than “add” because stack pointers are like electrons and the sign is wrong for historical reasons). When you do z[2], the code that comes out is “Add the constant value z to the base pointer and get the value from that memory cell. Add 2*sizeof(int) to that, and look in that memory cell.”  Basically, z behaves (at runtime) as it would if we’d declared it as “int *z = w”. Does this matter ever? I mean, it’s a couple more opcodes, but it’s 2021 and you absolutely do not care about that if you’re writing C. Possibly in some very pathological cases there’s some differing behavior you could trigger?

Speaking of pathological cases, how does all this nonsense figure into the switch? Well, let’s try it:

switch(x) {
	case 1:	printf("Hello\n");
		int w[y];
	case 2: printf("World\n");
		printf("%d\n", sizeof(w));
	default: printf("Bye\n");
}

And now we’ve finally found something so awful that even C won’t let you do it. Try to compile that, and C will politely tell you to get stuffed:

error: switch jumps into scope of identifier with variably modified type;

The compiler has noticed that you’ve dicked around with the size of the stack frame, and you should not be allowed to jump over that. This isn’t the message it used to print, for what it’s worth. When I first discovered this behavior way back in undergrad, the message it printed was rather more wonderful: “Can’t jump across dynamic memory contour.”

What would happen if you could? Here, dear reader, I must only say that I don’t know. The specification says only that we are not allowed to do it; it does not attempt to justify this decision. Remember when I said that the variably-modified type of the array made it very slightly and subtly different from a normal statically-sized array? That it’s really more like a pointer? Well, if you really want to jump over a stack allocation, in gcc at least (It’s not standard, and now that variably-modified types are a thing, those are recommended instead), you can do it like this:

switch(x) {
	case 1:	printf("Hello\n");
		int *w;
		w= (int *) alloca(y*sizeof(int));
	case 2: printf("World\n");
		printf("%d\n", sizeof(w));
	default: printf("Bye\n");
}

This is legal and it does the same thing as the previous code snippet, and the assembly language it compiles into is almost the same (I don’t actually understand the differences myself, but I suspect that they would optimize into a closer match if I turned on optimizations). Why does gcc allow this and not the other one? Remember, it didn’t allow the other form even before there was a specification telling it not to.

My best guess is that it offends the compile-time type checking. In particular, what does that penultimate printf print?

Well, now we get to that small oddity of how a locally-declared array is not quite the same as a pointer. Because let’s get rid of the switch and interrogate those variables…

int w[y];
int *z = (int *) alloca(y*sizeof(int));
printf("%d, %d\n", sizeof(w), sizeof(z));

What do you suppose comes out of that? Remember, under the hood, the generated code for w and z are pretty much the same. They’re both represented as a value on the stack which contains the address of another location on the stack. And yet, on a 64-bit system with 32-bit integers with y set to, say, 6, this prints “24, 8”: sizeof(w) is the size of the whole array – six four-byte ints – while z is the size of a pointer. The compiled code handling that “sizeof” is straightforward, if not all that interesting. sizeof(z) fetches the literal constant 8; sizeof(w) fetches the value that was stored in a register when the allocation occurred.

As far as I know, this is the only reason you can’t jump around the allocation: the compile-time type information would be wrong. If you could jump over the initialization of w, sizeof(w) wouldn’t be consistently defined. It’s not actually a problem for memory allocation at runtime: the stack frame will clean itself up when the function returns regardless of whether the allocation happened or not. This isn’t C++ where we need to be able to run destructors when the variable leaves scope.

But maybe there’s some other more subtle problem you could cause this way? Any C gurus out there with even darker wisdom than my own?

Back to the Bundle For Racial Justice, Page 3

Page 3 was a bit lighter on games that would run on my linux box, but here’s my impressions…

  • Pikuniku: Played well, pretty cute. Dylan had watched one of his Youtubers play this one, so he kept spoiling it for me. Also, while it starts up, it has a warning not to turn your computer off while the autosave icon is showing. I can’t tell if that’s a “We just left that in from the console port” thing or a deliberate parody.
  • Tape: Not a game. Some kind of project management software?
  • The Night Journey: Want to play this. No linux port.
  • Sleepaway: I guess this is another pen-n-paper game?
  • CanariPack 8Bit Top Down: Asset pack game making. I wish I could get my brain together enough to work on making a game.
  • Far From Noise: Another with no linux port
  • Codemancer: No Linux port, but an Android one. I like this game. It’s a kind of broadly Pokemonish Programming game: you play a student wizard in a world where magic takes the form of writing little scratch-like programs for your feisty animal familiar to execute. Hoping I can get the kids into it.
  • Serre: Another visual novel, which, I’ve mentioned, aren’t usually my thing. This one seems to be about a romance between a lonely young girl and an invading alien lady. I don’t care for the art style but the story is cute.
  • Wakamarina Valley, New Zealand: No linux port but it looks neat.
  • Vilmonic: This is more Dylan’s kind of game than mine, and after a few minutes something went squirrley with the controls causing my little dude to just continuously run downward.
  • Hidden Folks: A sort of Where’s Waldo kind of hidden objects game in a sketchy art style. Reminds me a bit of Highlights for Children.
  • Pagan: Autogeny, The White Door, Vignettes, Sagebrush, Tamashii: No Linux Ports
  • Intelligent Design: I found the game a little irascible. Evolutionary sandbox doesn’t sound like my thing. Also, the UI was too small. Finally, I’m left-handed, and the physical setup of my space precludes me from using the mouse right-handed. The reason I mention this is that while WASD is standard for movement, most decent games will also let you use the cursor keys, or at least remap the movement keys. This does not. It is incredibly inconvenient for me to use WASD because of the aforementioned “I have to use my left hand for the mouse” thing.
  • As We Know It: Another visual novel, this one a postapocalyptic romance I think. Visual style reminded me a bit of Goliath. Plot didn’t grab me really.
  • The Testimony of Trixie Glimmer Smith: Another visual novel. This one seems to be anthropomorphic animals and also Lovecraft? Soft pass.
  • Bonbon: Windows only
  • Death and Taxes: This is a ton of fun. You play a grim reaper in a bureaucratic afterlife in a way that’s reminiscent of Papers, Please, though the pacing is not nearly as frantic. It takes kind of a while to get to the point where the other shoe drops, but the art is fun and stylish and the relaxed pacing kept me from getting flustered.
  • Super Win the Game: Wow. Retro-styled puzzle-platformer that draws most heavily from, of all things, Zelda II: The Adventure of Link. The jump physics are a little weird, but it feels deliberate. Very wide open – I accidentally sequence-broke from the starting gate. Really enjoyed this, putting in about an hour before I noticed.
  • HUGE pixelart asset pack: Oof. Ever guiltier I feel about my failure to write the vidgams.
  • Signs of the Sojourner: No Linux port.
  • Game Development Cheatsheets – 2018 Edition: Not really sure what this is. It seems like job description posters for game dev jobs. Okay…
  • Jimmy and the Pulsating Mass: “Full length pixel RPG”? Yes Please. No Linux port? Fuck.
  • Task Force Kampas: Windows only, but I don’t like shmups anyway, so okay.
  • Glittermitten Grove: A fairy-themed colony management game. I think I might have liked this more when I was younger? I got overwhelmed pretty quickly and my fairies kept starving.
  • Silicon Zeroes: A puzzle game based on building circuits. Very similar to Nandgame, but with a bit of narrative and working at a higher level. I had fun with it and I plan to introduce Dylan to it.
  • Pixel Fireplace: Same libcrypto issue I’ve run into a few times. I am curious why so many of these games, apparently games without any obvious need for cryptography, have a dependency on a newish version of OpenSSL.

I also managed to sort out the dependencies for Haque and Minit, which I’d previously been unable to play. Both are sort of Zelda-esque Action-RPGs in an 8-bit style. Probably Speccy for the former and Apple 2 for the latter, though Minit kinda feels almost Arduboy. I liked Minit, whose gimmick is that you die (and restart back at home) every 60 seconds. Haque was a little too much noise for me.

Fiction: A Magic Carpet Ride

Anyway, here’s the punchline.


The pain was short-lived in that the concept of time had ceased to exist. It was, for the same reason, eternal. Zeke became aware of his own existence again in a void. There was nothing he could see, nothing he could hear, nothing he could feel, nothing he could smell, and nothing he could taste.

No, that wasn’t right. He could taste something. Strawberry lip gloss. Roxy was kissing him, and with that knowledge, his sense of touch returned. He was able to get his eyes open, but his brain was still scrambled from being stunned. He tried to ask a question, but what came out was closer to, “Flarb?”

“Vital signs are normal,” Lieutenant French said. “You were out for about five minutes.”

“Are?” Zeke asked. That was a real word, at least. He tried to remember how his hands worked.

“We’re definitely not on our Earth,” French said. “We’ve lost comms to Unified Space Command, and there’s no sign of the Sally Ride.”

Instead of trying to speak, Zeke managed to raise his eyebrows into what he hoped was an expression that conveyed the obvious question.

Roxy gave him an apologetic look. “Sorry,” she said.

Doctor Waller explained. “We patched into the phone network. Your mother’s number isn’t in service. Obviously, it’s been a few years, so it’s possible she changed it?”

Zeke tried to sit up, forgetting that he was strapped down. Roxy released the straps, and he tried to sit upright, failed, and slumped sideways. “Muh?” he asked. They followed his gaze to the viewport. The blackness of space had been replaced by blue skies and treetops.

“I didn’t anticipate that. Probably should have,” French said. “Our relative position changed when we jumped. I guess we’re lucky we ended up somewhere safe.”

“Maybe not just luck,” Waller said. “We know that the exotic matter is triggered by certain brain patterns, and it seems like it’s linked to a self-defense reflex. Possibly his subconscious influences exactly where we land. It might even explain why the universes he was drawn to resembled works of fiction from his memory. If that’s true, it might even be possible for him to learn to control it unassisted.”

“Where do you find a teacher for that?” St. George asked, sarcastically.

Zeke finally found his voice. “So where are we?”

“It seems pretty normal,” French said. “I think we’re in New York. Or whatever the equivalent of New York is in this universe. This looks like Central Park. Probably a good thing the cloak turned on automatically. I need to take some readings and adjust the calibration. And you’ll need a few hours to recover before we try again. It might help if you can figure out whether this universe maps to anything you know.”

St. George nodded to Mon’a. They produced a knit cap and pulled it down over their forked ears, then put on a pair of sunglasses to conceal their eyes.

Zeke tried to stand up and stumbled. Mon’a caught him. Zeke blinked a few times. “I remember now. Where I saw you before.”

“This is our first meeting.”

Zeke shook his head. “Not you-you. Your… Your actor I guess. I couldn’t place it because of the eyes. But a bunch of years ago you played the leader of a gang of underprivileged street toughs who befriended an Asian-American senator. Y’all were recurring characters in the last season before he became vice-president and the show ended. I liked that show.”

“Quite,” Mon’a said.

The six of them cautiously emerged from the hatch of the invisible space ship. The sun was shining, the air was sweet, the weather, pleasant. The crowd was sparse in this section of the park; no one seemed to take much notice of them.

“Keep a low profile,” St. George said. “Be on the lookout for…” He took a deep breath, mentally preparing himself. “Hijinks.”

“Hijinks?” Waller asked.

“Hijinks. Think about what kind of TV shows are set in New York. It’s basically fifty-fifty whether it’s a crime show or a zany sitcom.”

“That’s actually a good point,” Zeke said. And then he stopped talking, because he, among with the other four humans, stopped in their tracks to stare wide-eyed at a group of people a few yards off.

“It appears this universe has open contact with non-terrestrial life,” Mon’a said. “I do not recognize the species.”

St. George leaned toward Waller and said, sotto voce, “Okay. I didn’t really believe this whole TV Show Universe thing until right this minute. I think I owe you ten bucks.”

“I want to ask. Can I ask?” Roxy said, excitedly.

The members of SPACOM 3 quietly exchanged glances at each other. “We probably should go if we can,” French said. She was clearly struggling to show scientific detachment. “It would help with my measurements.”

“Quite,” Mon’a said.

“With your measurements?” St. George asked, skeptically.

“Yes, sir,” she said, stifling a giggle.

“Okay, go,” he said to Roxy. She skipped ahead.

“Excuse me,” she asked the four-foot tall creature. It turned its large, furry, orange head toward her and regarded her with large, googly eyes.

“Yes?” it asked. The inside of its mouth was flat black except for a tongue that looked painted-on, and it had no visible throat.

Roxy took a deep breath and with a broad smile, asked, “Can you tell me how to get, how to get to…”

Fiction: Mile Marker 24

It’s funny how ideas evolve. When I first had the idea that this is based on, the twist wasn’t even a twist. It only occurred to me a good twenty years after I first had the idea that Gabe wouldn’t explain his true nature to Dorothy from the outset. Now, I think it’s a fun reveal, though I’m not sure if it will really play out well as a full story – there’s obviously a big change in what kind of story you’re telling if you spend an extended amount of time believing it’s one kind of story and then it turns out to be a different kind. But me, I like things that transform into other things; I was brought up on a diet of kids shows about dudes who used magic swords to turn into Conan knock-offs and trucks that turned into robots. So, let’s see how it goes.


“Sorry, what?” Gabe asked. He glanced at the clock.

“Edgy. Distracted. I said you were edgy and distracted. Like the way you got distracted just now, ten seconds ago,” Dorothy said. “If you don’t want to help me study, you can just… I take that back. I need you to help me study.”

“Yes. Right. Sorry. Trigonometry. The cosine of the arcsine of x is the square root of one minus x squared,” He said. He looked at the clock again.

“Yes,” Dorothy said, “Except that it’s history. Are you okay?”

“Sorry,” Gabe said again. “Sorry. I… Can’t really explain.”

“Complicated?” she asked.

He didn’t answer, instead engaging in some kind of staring contest with the clock. “It’s okay,” Dorothy finally said. “Believe it or not I’m getting used to you. I know you’ll keep me out of trouble. Stay on the straight and narrow. Don’t break the rules. Don’t mess up the universe.”

Gabe looked down at her with a start, as though seeing her for the first time. “Don’t break…” he started. His face fell. With a faraway look, he quietly said, “There is no who we are but what we do. There is no us but what we choose.”

Dorothy dropped her pencil. “What was that? Where did you- That was me.”

Ignoring the question, he said, “I’ve been teaching you the wrong thing.”

She stood up, confrontational. “I wrote that. Part of it. Only it’s not done yet. How did you know that?”

“I’ve been keeping you out of trouble,” Gabe said. “I should’ve been helping you choose what trouble to get in. I need to get into some trouble right now.” He snapped back into focus. “You need to call emergency services. Right now.”

“What?”

“There’s been a car crash on route 170, near mile marker 24.”

“How did you- When?”

He looked at the clock. “About four minutes from now. You don’t have to tell them that part.” He reached into his pocket and took out a small gray square. Dorothy had seen it before, but only in brief glances; he’d always made a point not to call attention to it.

“How do you know? She braced for his usual “It’s complicated.”

She didn’t get it. “The same way I know about your poem,” he said. “I’ve read it.” He opened up the square like a compact and poked at it intensely.

Dorothy didn’t understand. “They have poems that haven’t been written yet in heaven?”

He looked up from the object in his hand, surprised. “Heaven? Oh. Oh! No. Look, when I told you I was your guardian angel, I didn’t mean it literally.”

He looked back at the clock. Not a lot of time, but he gave her a second anyway. “I’m from the future. About a hundred years. I am going to get in a lot of trouble for telling you this. Might not get see you again. But this rule is worth breaking. You need to make that call, and you need to make it right now.”

“But-” Dorothy tried.

Gabe tapped on the device in his hand, and then, quite unexpectedly, he put his hands on her shoulders. She looked at his hands in disbelief, then poked him with one finger, verifying that he was tangible. “Where I come from, you finished that poem. You finished it, and you called it Mile Marker 24. After the place where your stepsister died in a car accident. Make the call.”

He picked up her phone and put it in her hand. Reflexively, she took it and fumbled, trying to dial. “You can-” she tried

“Yeah,” Gabe said. “Not supposed to, but I can. I have to go. I don’t know if I can help, but I’ve got to try. If I…” He didn’t know how to finish.

Dorothy had glanced down at her phone as the call connected. Her eyes flicked back up just in time to catch the edge of a flash as Gabe vanished.

Fiction: On My Way

Another thing I wasn’t planning. SPACOM 3 was just supposed to be a cute cameo in a story that was mostly about Zeke’s struggle with the existential nature of living in a teen drama, and whether it was morally acceptable to date a fictional character. But I had so much fun writing them that I figured what the heck.


Lieutenant French tightened the straps holding Zeke to the partially-reclined chair in the middle of the drop ship, then placed the trigger in his hand. It reminded him of the buzzer from the quiz bowl game show he’d done back in high school. That had only been a couple of years ago, but it felt a lot longer.

“When you push the button, it will trigger a phased energy discharge. It’s based on K’lap’rr stunner technology, so there’s no chance of permanent damage, but it will stimulate the same part of your brain as a near-death experience. If our theory is correct, that should trigger the exotic matter particles.”

“Cool, cool,” Zeke said with a bravado he didn’t feel. “I shoot myself and hopefully it zaps this space ship back to my home with all of us inside. Or maybe it just zaps me personally back home, and I get to enjoy the view from geosynchronous orbit very briefly.”

“Low-Earth Orbit,” French corrected. “Geostationary orbit is much farther out.” She winced as it set in that this was not a helpful response.

“Why do I have to push the button myself?”

“We talked it out with Doctor Abermarle, and…” She wobbled nervously. “We’ve taken every precaution, and the theory is solid. But this is uncharted territory, and there’s no absolutes. Given that, we decided that it ultimately had to be your decision.”

Mon’a leaned uncomfortably close and coldly said, “As we are not enemies, it would be… Awkward for any of us to be the direct agent of your demise.”

“We’re coming with you, to who knows where,” St. George said. “So it’s not like we don’t have skin in the game.”

“Well thanks,” Zeke said. “And despite my sarcastic tone, I actually do mean that. You didn’t have to come with us.”

“Based on the fact that you were able to travel to Sparrow’s Folly twice while you were in your car, but the times you jumped outside of it, you ended up somewhere else, we believe that the exotic matter in your brain is influenced by a surrounding ferromagnetic field,” Lieutenant French said, “We’ve altered the internal magnetic field of the drop ship based on the precession of your unique quantum signature. If the theory is right, that should send you to your own universe. But there are constant terms in the calculation we can only estimate, so it may take us a few tries to calibrate it.”

“But that also means it might be hard for you to go home afterward,” Zeke said. “Why take the risk?”

“It’s your sunny disposition,” Doctor Waller said, standing up from the flight controls.

“No it’s not,” Zeke said.

“No it’s not,” St. George agreed.

“That is not the reason,” Mon’a added, dispassionately.

Waller shrugged. “Okay, it’s her sunny disposition,” he said, pointing a thumb at Roxy.

“What can I say? I’m cute as a button.”

“And you’re taking all this very well,” Waller said. “Most people on this version of Earth take a while getting used to the space ships and the aliens.”

“You get a lot of aliens in Sparrow’s Folly?” St. George asked.

“Once in a while for the Halloween episode, but otherwise, no,” she said.

“You are unperturbed by the prospect that your metaphysical nature derives from a work of fiction relative to your partner.” Those familiar with Mon’a’s speech patterns could tell this was a question.

Roxy shrugged adorably. “I’m nineteen. I think it’s pretty normal for a nineteen-year-old to think she’s the center of the universe. I just happen to have documentary evidence that it’s literally true in my case.” She squeezed Zeke’s hand. “I got your back, jack. Now or never. Ready?”

“I feel like I could stretch this out a little longer,” Zeke said.

“Just lay back and think of home,” she told him.

“Or failing that, somewhere nice. One of those fun beach shows,” St. George said. “Nothing too murdery. Try to avoid kaiju.”

“No zombies,” Mon’a said, neutrally.

“I hadn’t thought of that. Thanks.” Zeke sighed, and put his thumb on the button. “I hope this doesn’t hurt,” he said as he pressed it.

Then the entire universe was pulled inside out through a microscopic hole in his brain.