2022-04-02 13:02: No Pronouns, Mo Problems
Hello,
So I'm queer, and I'm making a queer game. And the biggest thing we trans people dream of, beyond (sadly) unrealistic dreams of Earth-ball sized titties, is other people actually using the correct pronouns for us (which sometimes feels just as unrealistic). It's honestly such a weird front to fight a battle on, but it wasn't really our choice was it?
Anyway, as such, I had the fun idea way back in 2020 to introduce a character named Glitch that could be one of the few characters who1 could remember what changes happened, so I had an easy way to communicate things to the audience. Glitch is an oddly-defined character who has been "erased from reality", to chase dreams of being a cute fluffy skunktaur. Glitch has returned to help Ada learn the same magic. Glitch has no pronouns.
Originally, Glitch having no pronouns was mostly me taking self-chosen pronouns to an extreme, as a self-imposed writing challenge, but as I saw more and more transphobes declare themselves free of pronouns, it also became a joke on them. Also, Glitch's freedom and dedication to honest self-expression provides a contrast to Ada's lack of freedom and hiding. A love letter for all the vibrant, weird, messy queer people that Ada (and myself) are too afraid to be.
Glitch, of course, broke the game engine and is the topic of this rathole that I'm writing about.
(WARNING: This Dev Diary entry contains spoilers for the level transition content between the Seattle Apartment Level and the Glitch's Non-Breaking Space Level. Nothing too major, but it may ruin some of the surprise.)
The Representation of Gender in Inform 7
In the real world, gender is a societally defined loose description of expected social roles based on the equally societally defined concept of "sex", describing the roles of beings within reproduction. The key word here is "loose". Did you know, stores in the US used to recommend pink for boys and blue for girls? Pink was the lighter form of the manly red of blood, and blue is often found in pretty flowers, which is some girly stuff. It only flipped in about the 1940s. Further, did you know that computer programming started as a career for women, not men? It was seen as very similar to their roles as planning a dinner for the boss coming over to visit your husband, which any good home economist could do. It also was an extension from the female-dominated human computers who did the actual math so the big-dicked NASA engineers could focus on the big picture. So "loose".
Computers can take a loose view of gender, but more often, they get a bit specific. Inform 7, no doubt informed by noted gender theorist Joe Biden, has three genders: male, female, and neuter:
Mister Zero is a man.
Malia Jennings is a woman.
Glitch the Skunktaur is a neuter person.
Mister Zero, Malia, and Glitch are all defined to be of the Person Kind, just with different genders. Male, Female, and Neuter in particular2. This seemed a good enough start for Glitch back when I started working in 2020.
Chatting with Glitch
For the most part, as I worked on other parts of the game, Glitch was mostly just hanging around as one of the beings affected by the changes to reality I implemented as a test3. Glitch leaves notes in the apartment, but does not actually appear there, which consumed most of my work in late 2020 and 2021. So with a skeleton implementation of the apartment completed, I decided the next step was to implement a post-apartment reunion conversation with Glitch. Rather than write a conversation system myself, I chose to use an extension called Conversation Package by Eric Eve4.
This extension combines a few other conversation based extensions as "levels" that build up into a full system. The lowest level simply defines a few actions that allow the player to ASK characters ABOUT stuff as well as TELL characters ABOUT stuff. It also includes some greeting/farewell protocols so the player can SAY HELLO or SAY GOODBYE to characters to better direct conversation. Here's a transcript of how that looks:
NullReferenceException
The featureless void of NullReferenceException spans all around me. My home... away from home.Glitch is here, fiddling with a fidget cube in paws, not paying attention. If I want to talk, I should SAY HELLO TO GLITCH.
>say hello to glitch
Glitch waves at me and says "Great to see you! It is perfectly delectable that a goody-two-shoes like you is finally getting into the real cool magic. Little Ada is all grown up and taking off the training wheels.">ask glitch about glitch
Beginning OmniNarrator Conversation Transcript with Being "GLITCH":ADA: This is a very... different look, isn't it? I mean, I wasn't expecting a skunktaur.
GLITCH: Oh that's very understandable! There was some warning in the notes, but this must still really be surprising. Really some of the freedom that comes with being erased and living in Glitch Space...
ADA: That's not to say it's bad, Glitch! It's super cool! The tail is so fluffy, the spots are wild...
GLITCH: They undulate! They undulate! Did you notice?
ADA: Actually, I had a hard time not getting lost in the holes in reality... They won't suck me in will they?
GLITCH: Not unless you want them to. :3
ADA: ...Why can I hear that emoticon?
GLITCH: It's a secret. ;3
OmniNarrator Conversation Transcript with Being "GLITCH" concluded.
The "stuff" can be either various Things or Persons in the world, or abstract Subjects like "Chronomancy".
The next level allows devs to define Response Rules which end up being cleaner to write than the After or Instead Rules that Inform 7 provides. The next level after that allows devs to define Default Response Rules that are triggered when the player tries to talk about stuff that no response has been written for. Those levels look like this in the code5:
Greeting response for Glitch the Skunktaur:
say "Glitch waves at me and [one of]says 'Great to see you! It is perfectly delectable that a goody-two-shoes like
you is finally getting into the real cool magic. Little Ada is all grown up and taking off the training
wheels.'[or]asks 'What's up?'[stopping]".
Default ask response for Glitch the Skunktaur:
say "That does not sound like something Glitch will have answers about. I should ASK ABOUT something else.".
Response for Glitch the Skunktaur when asked about Glitch the Skunktaur:
say "[begin-conversation]ADA: This is a very... different look, isn't it? I mean, I wasn't expecting a
skunktaur.
[paragraph break]GLITCH: Oh that's very understandable! There was some warning in the notes, but this must still
really be surprising. Really some of the freedom that comes with being erased and living in Glitch Space...
[paragraph break]ADA: That's not to say it's bad, Glitch! It's super cool! The tail is so fluffy, the spots are
wild...
[paragraph break]GLITCH: They undulate! They undulate! Did you notice?
[paragraph break]ADA: Actually, I had a hard time not getting lost in the holes in reality... They won't suck me in
will they?
[paragraph break]GLITCH: Not unless you want them to. :3
[paragraph break]ADA: ...Why can I hear that emoticon?
[paragraph break]GLITCH: It's a secret. ;3
[end-conversation]".
The next level guides the player towards fruitful conversation topics by introducing a TOPICS command, as well as a way to define suggestions. It looks like this in the code6:
Glitch Space is a subject. Chronomancy is a subject. Malia Jennings is a woman.
Glitch the Skunktaur is a neuter person.
The ask-suggestions are { Glitch the Skunktaur, Glitch Space, Chronomancy }.
The tell-suggestions are { yourself, Malia Jennings }.
As the conversation progresses, these suggestions can be updated to account for new information and to remove stale topics. The suggestions are provided when the player issues the SAY HELLO or TOPICS commands:
>say hello to glitch
Glitch waves at me and says "Great to see you! It is perfectly delectable that a goody-two-shoes like you is finally getting into the real cool magic. Little Ada is all grown up and taking off the training wheels."(I could ask it about itself, Glitch Space, or Chronomancy; or tell it about myself or Malia.)
>ask glitch about glitch
Beginning OmniNarrator Conversation Transcript with Being "GLITCH":ADA: This is a very... different look, isn't it? I mean, I wasn't expecting a skunktaur.
GLITCH: Oh that's very understandable! There was some warning in the notes, but this must still really be surprising. Really some of the freedom that comes with being erased and living in Glitch Space...
ADA: That's not to say it's bad, Glitch! It's super cool! The tail is so fluffy, the spots are wild...
GLITCH: They undulate! They undulate! Did you notice?
ADA: Actually, I had a hard time not getting lost in the holes in reality... They won't suck me in will they?
GLITCH: Not unless you want them to. :3
ADA: ...Why can I hear that emoticon?
GLITCH: It's a secret. ;3
OmniNarrator Conversation Transcript with Being "GLITCH" concluded.
> topics
I could ask it about Glitch Space or Chronomancy; or tell it about myself or Malia.
And the last level defines conversation nodes that can be used to group topics as well as create "closed" nodes that require a response from the player. But I'm not going to go in much detail about that, because if you read the transcript, you may notice that the transcript refers to Glitch as "it" and "itself". While people with "it" pronouns are valid and powerful, Glitch is not such a person. Glitch has no pronouns. How to fix it? Well, we need to change the very rules of the English language, or more accurately, Inform 7's Rules of the English Language.
Inform 7 and Natural Languages
While Inform 7 is written to focus on English language games to begin with, it actually can support games in other languages, but it requires some work. One of the default "extensions" that are included is English Language by Graham Nelson7. This extension defines a few things, but what we're most interested in are the various pronoun Substitutions. Let's begin by looking at the actual code that writes out the suggestions from Conversation Suggestions by Eric Eve:
Carry out listing suggested topics (this is the list suggested topics rule):
follow the suggestion list construction rules;
let ask-suggs be the number of entries in sugg-list-ask;
let tell-suggs be the number of entries in sugg-list-tell;
let other-suggs be the number of entries in sugg-list-other;
if ask-suggs + tell-suggs + other-suggs is 0:
say "[nothing specific]";
rule succeeds;
say "[if topic-request is implicit]([end if][We] [could] " (A);
if other-suggs > 0:
say "[sugg-list-other in topic format][if tell-suggs + ask-suggs > 0]; or [end if]" (B);
if ask-suggs > 0:
say "ask [regarding the current interlocutor][them] about [sugg-list-ask in topic format][if tell-suggs > 0]; or
[end if]" (C);
if tell-suggs > 0:
say "tell [regarding the current interlocutor][them] about [sugg-list-tell in topic format]" (D);
say "[if topic-request is implicit].)[otherwise].[end if][paragraph break]" (E).
This is pretty complicated, but the most important thing to notice is the lines that write the ask and tell suggestions.
The ask suggestions are written in the line that starts
say "ask [regarding the current interlocutor][them] about[...]"
. The tell suggestions are the same, so lets focus on
the ask suggestions.
The conversation extensions keep track of the current person being talked to with in the Value that Varies called
the current interlocutor
8. Then [regarding the current interlocutor][them]
part is from the English Language
Extension. In short, [regarding the current interlocutor]
helps set who or what the sentence is being written about,
so it can resolve the [them]
Substitution correctly. We can see the actual definition of the [them]
Substitution in
English Language by Graham Nelson, which can be found in the actual Inform 7 program directory:
To say them:
let the item be the prior named object;
if the prior naming context is plural:
say "them";
otherwise if the item is the player:
say "[us]";
otherwise if the item is a male person and item is not neuter:
say "him";
otherwise if the item is a female person and item is not neuter:
say "her";
otherwise:
say "it";
So I won't go into too much detail about English Language, but we see now the point of
[regarding the current interlocutor]
was, in that it sets the prior named object
Value that Varies, and if we look
for prior naming context is plural
:
To decide if the prior naming context is plural:
(- ((prior_named_list >= 2) || (prior_named_noun && prior_named_noun has pluralname)) -).
Oh hmmm, that's not the English-like syntax of Inform 7... What's going on? Let's take a quick detour into the past of Inform 7.
The Echoes of the Past
As you might guess from the name "Inform 7", Inform 7 is not the first version of Inform. There were 6 previous versions, which were very different. Rather than attempting to make the code look like a natural language (that is, English), it was a more traditional-looking C-like programming language, as you can see in this snippet of Inform 6 code:
[ R_1312 ;
if (((((parameter_value == I257_glitch_the_skunktaur) && (true))))) {
if ((((((PHR_879_r45 (I257_glitch_the_skunktaur))))))) {
if (debug_rules) DB_Rule(R_1312, 1312);
if (~~((((Global_Vars-->89) == 1))))
{
rfalse;
}
say__p=1;
ParaContent(); (PHR_1317_r47 ());
ParaContent(); print "ADA: This is a very... different look, isn't it? I mean, I wasn't expecting a skunktaur. ";
ParaContent(); DivideParagraphPoint(); new_line;
ParaContent(); print "GLITCH: Oh that's very understandable! There was some warning in the notes, but this must
still really be surprising. Really some of the freedom that comes with being erased and living in Glitch Space...
";
ParaContent(); DivideParagraphPoint(); new_line;
ParaContent(); print "ADA: That's not to say it's bad, Glitch! It's super cool! The tail is so fluffy, the spots are
wild... ";
ParaContent(); DivideParagraphPoint(); new_line;
ParaContent(); print "GLITCH: They undulate! They undulate! Did you notice? ";
ParaContent(); DivideParagraphPoint(); new_line;
ParaContent(); print "ADA: Actually, I had a hard time not getting lost in the holes in reality... They won't suck
me in will they? ";
ParaContent(); DivideParagraphPoint(); new_line;
ParaContent(); print "GLITCH: Not unless you want them to. :3 ";
ParaContent(); DivideParagraphPoint(); new_line;
ParaContent(); print "ADA: ...Why can I hear that emoticon? ";
ParaContent(); DivideParagraphPoint(); new_line;
ParaContent(); print "GLITCH: It's a secret. ;3 ";
ParaContent(); (PHR_1318_r48 ()); .L_Say520; .L_SayX510;
LIST_OF_TY_RemoveValue(GProperty(10, (PHR_916_r13 ()),p18_ask_suggestions), I257_glitch_the_skunktaur, 1);
RulebookSucceeds(); rtrue;
} else if (debug_rules > 1) DB_Rule(R_1312, 1312, 'context');
} else if (debug_rules > 1) DB_Rule(R_1312, 1312, 'action');
rfalse;
];
Oh wow, yikes, that's pretty gnarly! Makes you appreciate Inform 7's naturalistic syntax! Although... those strings being printed probably seem familiar, don't they?
So the secret of Inform 7 is that the code is actually first compiled into Inform 6, and then the Inform 6 compiler is what actually does the heavy lifting. The snippet of Inform 6 code is literally what the Inform 7 compiler generated from my code. In fact, each line had the corresponding Inform 7 line as a comment, but I removed those to make it a bit cleaner and hide the secret.
And in general, while we can just work in Inform 7, when necessary at the lowest levels, we can fallback to Inform 6
in Inform 7 code as we saw with the definition of prior naming context is plural
:
To decide if the prior naming context is plural:
(- ((prior_named_list >= 2) || (prior_named_noun && prior_named_noun has pluralname)) -).
This rule is defined in Inform 6, and we dive down into Inform 6 using the (- ... -)
, syntax. The idea is that those
are minus signs after the parentheses, and they mark moving down a level. You can also define wider blocks of Inform 6
code using the Include (- ... -)
syntax, which I actually had to do so I could reimplement some of the version spew
that you see when you start the game:
To say story release information: (- StoryReleaseInformation(); -).
Include (-
[ StoryReleaseInformation;
VM_Describe_Release();
PrintI6Text(" / Inform 7 build ");
PrintI6Text(NI_BUILD_COUNT);
PrintI6Text(" (I6/v");
inversion;
PrintI6Text(" lib ");
PrintI6Text(LibRelease);
PrintI6Text(") SD");
];
-).
Why do I mention all of this about Inform 6? Consider it foreshadowing... Let's end the detour and get back to the problem at hand, the game being quite rude and misgendering Glitch.
The Part in which Glitch Breaks the Rules of the English Language
Now, let's go back to that definition of [them]
from English Language by Graham Nelson:
To say them:
let the item be the prior named object;
if the prior naming context is plural:
say "them";
otherwise if the item is the player:
say "[us]";
otherwise if the item is a male person and item is not neuter:
say "him";
otherwise if the item is a female person and item is not neuter:
say "her";
otherwise:
say "it";
This makes it that so the right pronouns are used. If the sentence is being written about multiple people, it uses
"them". If the sentence is about the player character, it defers to another Substitution called [us]
which can print a
lot of different things depending on current settings of the story9. If the sentence is being written by a non-neuter
male, it uses "him". If the sentence is being written by a non-neuter female, it uses "her". And the last case is what
Glitch is in, neuter, where it uses "it".
There are other definitions for other pronouns, and they are similarly defined. The goal of these Substitutions is to make it easier to write adaptive text within the game. Taking a good example from the manual for Inform 7, Writing with Inform, we could write something like:
Instead of examining in the Netherworld:
say "[regarding the noun][They] [have] no clear outline in this misty netherworld."
Which will produce this output when the game is run:
> EXAMINE ME
You have no clear outline in this misty netherworld.> EXAMINE MARK
He has no clear outline in this misty netherworld.> EXAMINE DRUMS
They have no clear outline in this misty netherworld.
Very convenient! OK, we can then write our own Glitch-aware replacement10 for all the pronoun Substitutions! For
example, we can write [them]
as:
To say them:
let the item be the prior named object;
if the prior naming context is plural:
say "them";
otherwise if the item is the player:
say "[us]";
otherwise if the item is a male person and item is not neuter:
say "him";
otherwise if the item is a female person and item is not neuter:
say "her";
otherwise if the item is Glitch the Skunktaur:
say "Glitch";
otherwise:
say "it";
And with this change, Glitch is no longer misgendered:
> say hello to glitch
Glitch waves at me and says "Great to see you! It is perfectly delectable that a goody-two-shoes like you is finally getting into the real cool magic. Little Ada is all grown up and taking off the training wheels."(I could ask Glitch about Glitch, Glitch Space, or Chronomancy; or tell Glitch about myself or Malia.)
Great! But this isn't where this rathole ends... Let's talk about how the player can refer to Glitch.
How to Refer to a Being with No Pronouns
I know from experience that even if you tell people your pronouns, they often fall back to their initial assumptions. Especially if its pronouns they aren't familiar with like singular they or neo-pronouns. In general, the player using the wrong pronouns means the game fails to understand what they're referring to. Which is honestly a fine response. If the player character is Ada (she/her) and the only other Person around is Malia (she/her), and the player enters "TELL HIM ABOUT GLITCH", well, what "him" are you talking about player?
But then Glitch, is of course, a level beyond. Glitch having no pronouns is meant a challenge for me the writer, not for my players. Glitch is a very understanding skunktaur, well aware that having no pronouns breaks the rules of English11, and graciously lets it slide12.
So, with that, in addition to the default "it" that is generally used for neuter Persons, I wrote some code to allow a few other common pronouns to refer to Glitch:
Understand "them" or "him" or "her" as Glitch the Skunktaur.
I figured "it", singular "them", "him", and "her" should cover enough bases to be forgiving. And of course, I wrote some tests to make sure it worked! Here were my initial results of those tests, in part:
> ask them about glitch
(Glitch)
Huh, I do not know if there is that much more to say, let me think...Beginning OmniNarrator Conversation Transcript with Being "GLITCH":
ADA: Anything else I should hear about, uh, Glitch, Glitch?
GLITCH: Glitch should be experienced, not queried! ;3
ADA: But querying is a way to experience more Glitch!
GLITCH: Yeah, but about other things! Ain't much more to say. Glitch is cute and fluffy and cool. :3
ADA: Certainly seems like it.
OmniNarrator Conversation Transcript with Being "GLITCH" concluded.
> ask him about glitch
I'm not sure what 'him' refers to.
Oh, huh. "I'm not sure what 'him' refers to"? That's... odd. I specifically wrote a rule to let "him" refer to Glitch. What's going on?
The Part in which Ada, the Lesbian, Learns about Men
I began doing some investigation, and figured out that this response is made when there's an error in the Inform 6 code that gets generated. Inform 6 essentially has a pronoun dictionary that keeps track of what objects could be referred to by the player when they type in various pronouns. There was no 'him' entry in that dictionary. There was no 'him' entry because I actually had no men in the game yet!
I had already added another woman to the game besides Ada, her girlfriend Malia. I haven't actually implemented anything on Malia, and she's never moved into play, but she's in the code. But no men; there just hadn't been a reason yet. I had plans to add the mysterious Mister Zero as an antagonist, but hadn't done so yet. He'd make a good token male representation...
So now with a man to test with, I did some testing. I quickly found out that if I brought Mister Zero into the same room as Ada at some point in the game, even if I never interacted with him, then the game didn't run into the same error when referring to Glitch as 'him', even if Mister Zero was no longer around. Otherwise, the pronoun dictionary did not have an entry for 'him', and thus Ada, ever the resolute lesbian, had no idea what a 'him' could refer to.
OK, so I need to hide Mister Zero somewhere Ada sees him and that will fix it. I first literally brought him into the Complex Hallway at the beginning of the game to only immediately take him back out. He's a clever cat, he can do things like that. I then decided that was too dangerous because the player could try to interact with him. If I put him in another Room, there was a possibility that the player would never move Ada to that Room, and the bug would still happen. In the end, I had to write my rule in Inform 6, that rather than placing Mister Zero actually in the world, just adds him to the pronoun dictionary at the beginning of the game:
[Token male representation.]
Mister Zero is a man. Mister Zero is in a room called Zero's Office. The printed name is "Mr. Zero".
The make sure ada knows about men rule translates into I6 as "KNOW_MEN_R".
Include (-
[ KNOW_MEN_R;
PronounNotice((+ Mister Zero +));
];
-)
The make sure ada knows about men rule is listed in the when play begins rulebook.
The cool thing to note here is that along with having a way to specify what a Rule translates into in Inform 6, I
can refer to items using their Inform 7 names13 while writing Inform 6 snippets like (+ Mister Zero +)
. You use
(- ... -)
to go down a level into Inform 6, and then use (+ ... +)
to go up a level back into Inform 7. Pretty
nifty syntax, eh?
I'll spare you the fixed results, and wrap up our journey down this rathole.
The End For Now
OK, that's the end of this rathole for now, but I'm 100% certain this is not the end of my problems with accounting for Glitch's lack of pronouns. While I did go ahead and rewrite all the substitutions, I haven't actually seen all of them in action. I'm certain that at some point I'll notice bad phrasing in some message as Glitch glitches about the place (Glitching is Glitch's calling card). But hopefully those will be easy to fix.
It was frustrating to have to start considering the underlying Inform 6, but it really it has been extremely rare that I have had to do that, and as you can see it happened literally when I was trying to break the Rules of the English Language by Graham Nelson.
Your Not-so-humble Dev,
-
Yes, "who" is a pronoun. I know. Leave me alone.↩
-
Actually, behind the scenes, neuter-ness is a separate Property from Gender. It overrides the Male/Female Gender Property, as we'll soon see. Thus, it is a much better understanding of non-binary identities than many people have in real life.↩
-
Glitch can be affected by changes, but will notice the changes, unlike Ada, who thinks that is just how reality has always been. Glitch is so cool.↩
-
Extensions are always defined with their authors, so extensions with the same name can be distinguished by author. For example, I ended up having to write an extension called "Custom Pronouns by Jayce Mitchell" to solve this issue. It's actually a rather nice thing, and I think helps point out that even single-dev games like this one depend on the work of others.↩
-
I actually hadn't written a Default Response Rule yet! I don't think this one is very good, I'll work on a better version later.↩
-
Note that I use a nice syntactical feature of Inform 7 where rather than repeating the name of something being defined, it remembers the last thing defined and treats abstract definitions like
The tell-suggestions are { yourself, Malia Jennings }.
as applying to that.↩ -
Graham Nelson is the creator of Inform 7, so many of the very basic components are credited to him, obviously.↩
-
Because you often have to reserve common words for the use of the player in Inform 7, you often see devs pull out the twenty-five cent words like "interlocutor".↩
-
By default the player character is referred to with second-person pronouns like "you", but it can be changed so that the player character is referred to singular third-person pronouns ("him" or "her"), singular first-person pronouns ("me"), plural third-person pronouns ("them"), or plural first-person pronouns ("us"). Sadly, no "y'all", but it wouldn't be too hard to add.↩
-
If we were to just write another definition, then we wouldn't actually replace the definitions from English Language. In fact, the compiler would throw an error. However, we can actually replace entire sections of code from other extensions using something like
Book 0 - Custom Third-Person Pronouns (in place of Section 3 of English Language by Graham Nelson)
as I did in my Custom Pronouns extension.↩ -
As I was describing this problem to my computational linguist roommate (in vain, I sounded like a madwoman), he asked what the rules are if a person has no pronouns. I don't actually have any! I simply have the rule that I try to write something, and if I end up using a pronoun to refer to Glitch, I rewrite it. And note, it's only Glitch that has no pronouns, Glitch will still use other people's pronouns because that's just basic decency and respect.↩
-
In my authorial conversations with Glitch (yeah, I'm that type of an author), Glitch let me adopt temporary pronouns for Glitch when I'm particularly struggling. A really swell thing for a critter to do.↩
-
Which, as you can see above, get mangled in the Inform 6 code that is generated.↩