Tuesday, June 21, 2022

I went to a conference and nobody spread COVID

People are not all on the same page about COVID planning. I don't just mean vax-deniers. My social circles -- the good and sensible people reading this post -- range from "I am planning in-person social events" to "in-person social events are morally indefensible".
Nor does this boil down to everyone deciding their own risk tolerance. Every person does decide their own risk tolerance, but it's a collective risk and it has to be managed collectively. By people with different goals and different levels of vulnerability. This is not easy! "Minimize all risk" and "minimize risk involved in living my life" aren't even two ends of a spectrum. They're two vectors in a branchy mess of decisions.
How does this apply to conferences? We haven't decided. It's not a minor question. We're now seeing events relax their COVID policies at the last minute, and it's hard not to read that as a calculated attempt to sucker people in. On the flip side, PAX East killed someone. Of my coworkers who went to GDC this year, nearly all of them caught something (not all tested positive for COVID but there were gobs of fevers and sore throats). It scared me good.
Then again, I've been going into grocery stores regularly through the whole pandemic, wearing a cloth -- not N95 -- mask. So who am I to sneer?
No sneering here. A couple of weeks ago I hit my introvert wall: I attended a conference in Montreal. This was Scintillation, a tiny sci-fi convention. I went to the first Scintillation in 2018 and really enjoyed it. I missed 2019; 2020 and 2021 were cancelled; this year the organizers and regulars collectively said "Dammit we're doing this." Reader, I did it. Air travel and all. I had a great time. (I took part in a couple of panel discussions about different authors.)
And: nobody got sick. That we can tell! It's impossible to be certain about these things. One person reported a marginally positive antigen test two days after the conference, but they followed up with a PCR and that was negative. Another person felt like crap a week later, but the first test is negative, and the timing doesn't really fit. Our conclusion is that, by diligence or luck, no COVID was spread at the con.
This post is neither a brag nor a confession. Rather, I want to explain the event policies that kept the risks low and, ultimately, were successful at keeping people safe.
  • This was a small event. I think attendance was about 75 people. Everybody fit in one function room.
  • Proof of vaccination was required to pick up your badge.
  • Indoor masking was required, and we were serious about it. If you were in the hotel, aside from your own hotel room, you wore a mask. (Obviously we couldn't enforce this for other hotel guests but we were the only occupants of the function-room floor.) If you wanted to drink water, you went to the con suite and lowered your mask long enough to take a swallow.
  • The con had some rapid tests available at the check-in desk.
  • Someone made a couple of box-fan air filters for the event. One ran in the function room, one in the con suite. I hadn't heard of this project but it gets good reviews from professionals.
  • Indoor dining was not banned, but for people who wanted to avoid it, the conference posted a list of restaurants which would deliver to your hotel room.
  • A couple of outdoor gatherings (picnics) were scheduled; these were unmasked.
For my own part:
  • I stayed away from social gatherings, even small ones, for several days before the event.
  • I got a PCR test three days before the event. (This turned out to be a waste, because the test web site was down and I didn't see the result until the day I got home! But it was negative after all.)
  • I wore an N95 mask while in the conference space, and also for all air travel (airports and airplanes). I switched to a cloth mask when wandering around Montreal museums and shops.
  • I got my second vaccine booster two weeks before the event, so as to (hopefully) be at max immunity.
  • I did a couple of rapid tests in my hotel room during the event.
  • I got most meals take-out. (Mmm, bao.) I ate in restaurants a few times, but I tried to pick uncrowded restaurants, and I ate either alone or with one other person at the table.
  • I yukked it up without a mask at the outdoor picnics.
  • I kept doing rapid tests for the week after the event. And stayed away from social gatherings, well, at least until Thursday.
So, as you see, we were pretty careful. But we could have been more careful in some ways. But this is what we did.
The intangible factor was that the conference organizers cared about safety and were willing to make firm rules. We had discussions in advance about how masking would work, how hydration would work, how everything would work. What were the accessibility needs? (With 75 people registered and no at-the-door entry, this was a well-defined list.) Would we bring back the singing social events from the first two Scintillations? (No way.) And so on. Everybody was on board with the situation before they arrived. We all knew the people in charge were prepared to say "Mask up or get out," and because of that, they never had to.
I can't prove these precautions will protect everybody. I don't know how to estimate the odds. (If we were lucky enough to have zero contagious people show up, then we wouldn't know how well the masks and filters worked!) But this is, I would say, a minimum level of diligence for events in the 100-person range.
Masks suck, and everybody hates 'em, and this is where we are.
I can't even think about events in the 10000-person range. GDC and PAX still scare me, and will continue to scare me until the vaccine situation changes a lot.
I hope this information is useful.

Wednesday, June 15, 2022

AI ethics questions

Last week an "Google AI ethics" article went round the merry-go-discourse. I won't bother linking except for this apropos comeback from Janelle Shane:
Stunning transcript proving that GPT-3 may be secretly a squirrel. GPT-3 wrote the text in green, completly unedited! (...transcript follows)
-- @janellecshane, June 12
We're facing piles of critical questions about AI ethics. They do not include "Is Google oppressing sentient AIs?" Here's a starter list of real issues:
What's the difference between using an AI algorithm as part of your artistic process and using it as an artistic process in itself?
Using an AI image algorithm as a source of idea prompts? Tracing or redrawing pieces of the output in your own work? Using pieces of the output directly? Generating ranges of output and iterating the prompt in the direction you want? Generating ranges of output and using them as PCG backgrounds in a game? What will we count as legitimate and/or desirable artistic work here?
How much human supervision do we require on procgen output?
If the background imagery of a game (movie, whatever) shows AI-generated cityscapes, sooner or later something horrible will appear. If an AI is generating personalized emails, sooner or later it will send vile crap. Do we hold the artist/author responsible or just say "eh, it's AI, Jake"? Do we insist on a maximum "error rate"? What's the percentage?
(Do we hand the problem of preventing this off to another AI? "Generative adversarial network" in the literal sense!)
How do we think about ownership and attribution of the data that goes into AI training sets?
Is the output of an AI algorithm a derivative work of every work in the training set? Do the creators of those original works have a share in the rights to the output?
If an image processor sucks up a million Creative Commons "noncommercial use only" images for its training set, is the output of the net necessarily Creative Commons? What if it accidentally grabs a couple of proprietary images in the process? Is the whole training set then tainted?
(We're already deep into this problem. The past few years have seen a spurt of AI image tools with trained data sets. They're built into Photoshop, iOS and Android camera apps, AMD/NVidia upscaling features, etc, etc. What's the training data? Can we demand provenance? Is this going to turn into a copyright lawsuit morass?)
What does it mean if the most desirable artistic tools require gobs of cloud CPU? Will a few tech giants monopolize these resources?
Will we wind up with a "Google tax" on art because artists are forced to use Colab or what have you?
(This isn't new to AI, of course. Plenty of artists "have to" use a computer and specific hardware or software tools. The tech companies aren't shy about extracting rents. But AI could push that way farther.)
What about the environmental costs? Will artists get into an arms race of bigger and more resource-intensive AI tools? All computers use energy, but you really don't want a situation where whoever uses the most energy wins. (Bl*ckchain, cough cough.)
What does it mean when AIs are trained on data pulled from an Internet full of AI-generated data? Ad infinitum. Does this feedback loop lead us into cul-de-sacs?
What assumptions get locked in? It's easy to imagine a world where BIPOC people just disappear from cover art and other mass-market image pools. That's the simplest failure mode. AI algorithms are prone to incomprehensible associations. Who knows what bizarre biases could wind up locked into our creative universe?
How do we account for the particular vulnerabilities of AI algorithms? Can we protect against them once this stuff is in common use?
What if saboteurs seed the Internet with pools of images that are innocent to human eyes, but read as mis-tagged garbage to AI algorithms? Or vice versa: hate speech or repugnant images which AI algorithms pick up as "cute kittens". Could that get incorporated into training sets? Turn every AI tool into a Tay-in-waiting?

The meme-y AI art is all visual and text. But I'm particularly interested in how this plays out for audio -- specifically, for voice generation.
I love building messy, generative text structures. I also love good voice acting in a game. These ideas do not play together nicely. (I guess procgen text is a love that dare not speak its name?)
Text variation like this is trivial in Inform 7:
say "[One of]With a start, you[or]Suddenly, you[or]You blink in surprise and[at random] [one of]realize[or]notice[at random] that your [light-source] is dimming. In just [lifespan of light-source], your light will be gone.";
But if you're writing a fully voice-acted game, you don't even consider this sort of thing. Not even so simple an idea as contextual barks in a shooter game: "Get [him/her], [he/she]'s behind the [cover-object]!" It's not in scope. Which is a shame!
AI voice generation is an obvious path towards making this possible. It's also an obvious path to putting all the voice actors out of work.
How do we negotiate this? What does it mean to put an actor's unique performance into an infinitely extensible corpus of text? How do we pay people when "per line" is a meaningless measurement? How much sampling do we need for a good result? Do we need direct-recorded "cut scenes" for the really emotional bits? What about applying "moods" (angry, tired, defeated, scared) to specific lines to match the current state of the character? There's lots of possibilities here, and we have no idea how to work them out in a way that's fair to both designers and performers.

Anyhow, I am nothing like an expert in this stuff. This post is very much off the top of my head. Some folks who know way more than me and have more experience with AI tools: Janelle Shane, Max Kreminski, Mike Cook, Lynn Cherny.

Tuesday, June 7, 2022

Aaron Reed's "50 Years of Text Games" is now crowdfunding

You probably followed Aaron's blog series last year. Now it's becoming a book with revised articles, bonus material, a lovely layout, and fancy binding. A half-century of the history of text-based games. (You may recall that one of my games is on the list.)
I admit to mixed emotions about Kickstarter these days. They haven't backed off on their crypto horseshit. They haven't pushed it forwards much either, that I can tell. There was a followup post in February which doesn't say much beyond "We're listening to feedback." (I think you get the gist of mine.)
But of course I want Aaron's book to succeed. Which it has! -- it crossed the goal line as I was writing this post. Now I want it to do multiples. I also want Kickstarter to see pushback. Aaron has thoughts about this too; see the FAQ on his KS page. He also notes that there will be other ways to pre-order the book after the KS campaign is over. Read, decide what you want to do.
However you get it, the book will be a must-have for the shelf of the IF scholar. Or enthusiast. Or you.

Tuesday, May 31, 2022

Cragne Manor source code (some of it)

You may remember Cragne Manor, the collaborative exquisite-corpse IF game that launched in 2018. (My post about it at the time.) The project was a tribute to Mike Gentry's Anchorhead, organized by Ryan Veeder and Jenni Polodna. It turned into an absolutely absurd agglomeration-fest of eighty-four IF authors. Each author wrote a separate game in Inform 7, following certain guidelines, and then the editors stitched them together.
Cragne Manor includes contributions from many of the IF authors of the '90s and '00s, as well as more recent years. It's a really interesting snapshot of a variety of styles. However, the original project didn't encompass releasing the source code. We talked about it! But Jenni and Ryan had enough on their plates trying to make the game work. Asking them to create a source release too would have been ingratitude.
As it happened, a couple of weeks ago, Jason Love -- one of the 84 Cragne authors -- up and posted his source code on the forum. Jason's post set off a wave of other people doing the same.
Seize the moment, right? I got permission from each of those people to archive their Cragne source files on my own web site. I include my own, of course.
As of today, my page includes thirteen of the game-files which constitute Cragne Manor. I started the weekend with five. There's a bunch more. Let's put the word out!
If you want your Cragne source on my site, please send me the source file. (The raw code -- that's Source/story.ni in your I7 project folder.) Or, if it's already posted somewhere, pass me a link and let me know I have permission to include it.
Thanks! I doubt this will ever be a complete collection, but it would be nice to gather as much as possible.
(But please don't harass Ryan and Jenni about this. This is my effort, not theirs.)

Monday, May 30, 2022

Recent puzzly games: summer 2022 edition


Three scientists of Taiwanese descent explore a mysterious ecology. This is an oddly lumpy hybrid of parkour metroidvania, tetromino puzzles, and character-centric story game. Each mode is pretty enjoyable but switching felt like an interruption.
This didn't bother me too much, and I progressed through a large part of the game. (Through four key species.) Unfortunately, I could not get my head (or fingers) around the wall-running-and-jumping mechanic. I got as far as I did through sheer bloody-minded flailing, but I never really understood how to chain moves to get where I wanted to go. This is a pity -- the parkour mechanics are puzzle mechanics; I was enjoying the challenge of looking around and figuring out how to proceed. Like the best Prince of Persia games -- except that PoP made you feel great at executing moves, and this game does not. Eventually I fell too many times and quit.

The Inheritance of Crimson Manor

A pleasant first-person puzzler in a creepy Victorian mansion. The puzzles never get very hard; nor do they achieve the hands-on haptic satisfaction of the Room series. But there's lots of them. You can have a satisfying wander around, happily overwhelmed by an abundance of locked doors and mysterious puzzle-boxes.
(There is one sliding-block puzzle, but it's quite easy of its kind, so I didn't have to flip off the developers.)

Skábma: Snowfall

An action-platformer in the traditions of the Sámi people. You fell asleep on reindeer watch -- oops! While pursuing an errant doe, you discover a noaidi drum, the tool of the Sámi shaman. Good timing, because the village is falling ill from some strange infectious ooze...
This is really well done! You run around a big, knotty mountain landscape, chasing spirit familiars and gaining metroidesque powers. The platforming is puzzly, not reflex-oriented; you are trying to figure out what to do, not trying to execute it. It's not on rails, but the margins of error are extremely generous.
You can explore freely -- plenty of collectibles to root out -- but you're meant to follow the trails which are revealed by the beat of your drum. The drum is central to the game, just as it should be: besides showing your goals, it also lets you manipulate ooze outbreaks, illuminates dark caves, restores your health, and keeps time with the background music. (That last always put a smile on my face.)
My only complaints are, first, some of the cave and forest scenes are really too cramped for the camera mechanics. Yes, you need those narrow tunnels and dense trees to contrast with the mountaintops and vast caverns later on. (Landscape: gorgeous! Highly varied!) But when you're scurrying through a rabbit warren and the camera can't see around corners, it's more annoying than atmospheric.
And, second, they fell victim to one of the classic blunders: the climactic action scene is the hardest. You have to use all your jumpy powers, fine -- but with a giant kicking your butt! That's not how you've been practicing. Sigh. I powered through but it threw the tone off.
(Third, there are ooze zombies. I usually have a no-zombies rule but these aren't the really threatening kind. They're very slow. You just have to drum and sometimes jump on them.)
Satisfying, beautiful, educational -- if you're unfamiliar with Sámi traditions, which certainly describes me -- and very approachable. Try it.

Recursive Ruin

A first-person puzzle game with a "nested" world. The space contains itself at a smaller scale, and so on infinitely inward (and outward). Now you're recalling Maquette; but Recursive Ruin feels quite different.
RR has a glitchy fractal aesthetic rather than cozy toy tilt-shift, but that's not the main difference. In Maquette, you stayed the same size as you walked inward or outward. So each copy of the world was smaller or larger than the last. In RR, you shrink or grow to match the world-instance you're entering. You can go inwards/outwards forever.
This is brain-twisty from the get-go. Maquette allowed you to distinguish where you were by size; but in RR, every instance is the same size. Sort of. You really have to visualize the world as cyclical. On top of that, you have a "shift" button which slides the inner/outer world up or down, changing the relative locations of everything.
RR's mechanics drag you into its warped reality -- and they just work better. Maquette's scaling meant that you couldn't go very far inward; the world got too small and crowded to deal with. Similarly, going outward, the world became vast boring stretches of pavement that you had to run through. RR avoids this problem and feels much better laid out.
RR tends to flip back and forth between pure-puzzle mode and a narrative about an artist's traumatic past. Plenty of games have alternating scenes like this, but RR has alternating chapters -- sometimes you get a full-length walking-sim episode in between puzzle chapters. Mind you, it's a good walking sim (in the psychological-horror mode). A bit heavy-handed, but mostly I just wanted smoother pacing.
At any rate, the puzzles are pretty solid. Not extremely difficult once you wrap your head around the geometry, but a good variety of stuff built on that basic idea.
And, hey, after Maquette I thought "That is a cool mechanic but I bet more could be done with it." Now more has!
(Sorry, this whole review comes off as backhanded shade on Maquette. I enjoyed Maquette! It did interesting story things! The last chapter had clever puzzles! But the puzzles felt hit-and-miss before that point, and you had to spend a lot of time running across vast boring stretches of pavement.)


A first-person puzzle game in an abstract low-poly world. This would be Yet Another One Of Those except that the puzzles are really well-designed! I finished it a couple of days ago and now it's high on my puzzle recommendation list for the year.
It's definitely in the Myst sphere of influence rather than Talos/Xing/Portal. Every enviroment, every mechanic, and every puzzle is unique... except that's not true. Each idea comes back deeper. You'll solve a puzzle, move on, and then realize there was more to the original mechanic than you thought. So you return to it -- or solve a similar puzzle -- but now you're working at a different level.
(I suppose a better comparison is Antichamber or the recent Sensorium. Abstract world; simple visual style; not a trace of story; a deep, serious focus on the puzzle design.)
The "progression by learning" idea recalls Outer Wilds. I don't mean that Platonic is a pure-information game. It's not; when you unlock a door it stays unlocked, when you solve a puzzle it stays solved. But there's still that sensation of space opening up around you. And this happens a lot. The designer has done a really creditable job of having every puzzle idea recur and build on itself. They get tangled up with each other too. Sneaky stuff.

Tuesday, May 10, 2022

Patricia McKillip (1948-2022)

This afternoon, Locus posted an obituary for Patricia McKillip.
I have trouble finding what to say. Really a large part of everything I've written has started with "Maybe I could do that too." After reading Riddle-Master or Changeling Sea or Fool's Run or just remembering a line or a phrase or a turn of thought.
I'm gonna just go back into my book room and pick out some words.
"If you hate the sea so now," Mare asked in wonder one day, "why don't you leave?" Mare was a few years older than Peri, and very pretty. She came to work in the morning with a private smile in her eyes. Down at the docks, Peri knew, was a young fisherman with the same smile coming and going on his face. Mare was tidy and energetic, unlike Carey, who dreamed that the king's son would come to the inn one day and fall in love with her green eyes and raven tresses. Carey was slow and prone to breaking things. Peri attacked her work grimly, as if she were going to war armed with a dust cloth and a coal scuttle.
That same smile.
He woke in the morning, face-down in a book. Nyx was stirring the fire.
"You should never sleep between two spells," she commented.
Witches and magicians turn out to be the protagonists. It's common these days but back then they drifted on-stage as helpmeets and quest-givers and destinations. McKillip's could be confused, arrogant, ignorant, and central. Sometimes the sorcerer ran off with the girl or the boy rather than vice versa.
"...Then, outside the seventh door, his name was called again; but the Thing did not touch the door. He waited in despair for it to enter, but it did not. Then he grew impatient, longing for it to enter, but it did not. Finally he reached out, opened the door himself. The Thing was gone. And he was left to wonder, all the days of his life, what it was that had called out to him."
He stopped. Elliard said in spite of himself, "Well, what was it?"
"Kern didn't open the door. That is the only riddle to come out of Hed. The stricture, according to the Riddle-Masters at Caithnard is this: Answer the unanswered riddle. So I do."
So I do, when I'm most myself.
The walls flickered around them at the changing hour. The chartreuse heated to a vibrant orange that caused them both to duck over their beers.
"Lord," Sidney said painfully. "I had no idea what goes on here at this time of morning."
My virtual space on IFMud runs in those times and colors. Well, my colors, not the Constellation Club's. Later, I put them in Dreamhold. I may yet run them up the walls of my house.
Calyx made a satisfied noise. "Here we are. According to Chrysom, the power to move Ro House is passed from generation to generation of Holders' children, who are born with an innate ability, for the Holders instinctively seek out as mates those who may inspire the power within the child conceived."
...They all gazed at Iris. She put down her needlework uncertainly, flushing. The Holder's brows had risen. She pulled a pin out of her hair absently, her mind running down the past; a smile, reminiscent, wondering, touched her eyes.
"Mother," Iris said accusingly.
"Well, I didn't know," the Holder said. "He seemed a very practical man."
Just look at them.
Peace, tremulous, unexpected, sent a taproot out of nowhere into Morgon's heart.
For us all.

Thursday, April 28, 2022

Inform 7 open-source release

Today is the traditional Inform 7 birthday. Okay, April 30 may be more traditional, but close enough. The point is, today Graham posted the full source code for a new release of Inform 7. Here is his announcement forum post.
This is tagged as a beta release, and the IDEs have not yet incorporated the new compiler. So it's not fully ready for use. But I have successfully downloaded it, compiled it, and run some tests.
In other good news, the Inform bug tracker is back, now in Jira form.
Some notes:
Do you like NeXT-style release numbers, named releases, datestamps, or semantic versioning? Inform has you covered every which way! This release is formally "Inform 7, v10.1.0-beta+6U93 'Krypton' (28 April 2022)".
Some older versions of I7 now have semantic version numbers as well, and will be available as options in the IDE:
  • 6L02 (May 2014): Inform 9.1
  • 6L38 (August 2014): Inform 9.2
  • 6M62 (December 2015): Inform 9.3
This is good news for existing users, as upgrading a large game across Inform versions has always been a moderate headache. It's even possible that users will contribute bug fixes to the 9.x branches.
Compiling Inform is not a one-liner. This is because Graham has actually released three packages: inform, inweb, and intest.
All three are written in inweb, a "literate programming" meta-dialect of C. Read the forum post or the inweb manual for a full explanation of this. The micro-summary is that it's C code annotated with documentation such that it can generate either an executable or a manual.
The fact that inweb is written in inweb means that the whole mess requires a certain amount of bootstrapping, in the original sense. But it's just a few commands, and they go smoothly on Mac/Win/Linux. See the READMEs for details.
Reading source code in this style is somewhat unnerving to us old coders. You can look at a source file, or the equivalent web page -- they're blatantly the same thing; just nicer formatting on the web version. It reads like a manual with bits of sample code. But of course this is the code. You're looking at it. If you want to fix a bug, you fix this file; the change applies to executable and manual alike.
The effect is somehow like one of those night-in-the-museum fantasies where the buffalo and the Transparent Woman start walking around and talking to you. In the manual (or source), Graham quotes Christopher Wyk (CACM 33.3, 1990): "...no one has yet volunteered to write a program using another's system for literate programming." This may yet remain true.
This I7 release doesn't change the language much from the last (2015) release. The big changes are under the hood. The classic two-stage compiler (I7→I6→Glulx) is now three stages (I7→Inter→I6→Glulx). But the new Inter stage can also be compiled to C source and then a native executable. More formats like JS or C# could be added in the future. This is still experimental, but it opens the possibility of using Inform as middleware in other game frameworks. (This has always been possible with enough layers of hackery, but now it's more sensible.)
Plenty more could be said, but I think that'll do for tonight. Have fun poking around.