Inform 7 Home Page / Documentation
§17.21. Understanding mistakes
When inspiration strikes the player, he can usually be relied upon to make a good-faith effort to communicate the new idea: he will guess the right command. If he guesses wrongly, the mistake is probably the author's, because a good author will try to anticipate all possible wordings and make all of them work.
Nevertheless it is sometimes good practice to nudge the player towards the right wording - particularly if the player has the right idea but is not explicit enough: for instance, typing TALK TO JUDGE when we really want to know what is to be said (JUDGE, GUILTY); or if the player tries something like PLAY CHESS rather than MOVE PAWN TO KING 4. Similarly, if we make a casual reference such as "In your childhood days, you loved sliding in stocking feet across this hallway", a player might type SLIDE IN STOCKING FEET: a nice idea, and which deserves a nice response, even though it asks to do something beyond the scope of the story.
Inform provides a simple mechanism for recognising a command but at the same time recognising that it does not properly specify an action. Such commands are called "mistakes", for the sake of a memorable term, but the player has not really behaved badly, and should be helped rather than reproved. For instance:
Understand "act" as a mistake.
While that works - the command to "act" is indeed rejected - it is not very good, because no very helpful message is brought up. The following is much better:
Understand "act" as a mistake ("To join the actors, you have to adopt a role in the play! Try PLAY HAMLET or similar.").
Or we could once again insist on a given context:
Understand "act" as a mistake ("To join the actors, you have to adopt a role in the play! Try PLAY HAMLET or similar.") when the location is the Garden Theatre.
That still has the drawback that the command "act hamlet" will not be recognised: so the final version we want is probably
Understand "act [text]" as a mistake ("To join the actors, you have to adopt a role in the play! Try PLAY HAMLET or similar.") when the location is the Garden Theatre.
since the "[text]" part will soak up any words the player types (or none), meaning that any command at all whose first word is "act" will be matched.
We need to be careful to avoid circular things like this:
Understand "[text]" as a mistake ("'[the topic understood]' is something I really wish you wouldn't say.") when the topic understood is a topic listed in table 1.
This doesn't work because the topic understood isn't set until the line has been understood, but Inform checks the "when..." condition before it tries to understand the line. Indeed, even this:
Understand "[text]" as a mistake ("'[the topic understood]' is something I really wish you wouldn't say.").
is unsafe (quite apart from being unwise!) - again, "topic understood" doesn't exist for a mistake, because in a mistake, nothing is understood.
The following is often useful during beta-testing of a new work, though we would not want it in the final published edition. Many authors like to ask their testers not to try anything in particular, simply to play naturally: but to record the transcript of the session, and email it back to the author. The following command is a device to allow the tester to type a comment in to the transcript:
Understand "* [text]" as a mistake ("Noted.").
For instance, the tester might type "* DIDN'T WE SAY DARCY WAS TALL?", to which the story would reply "Noted." - and the author can search for such comments when receiving the transcript.
If we are careful, we can make the reply depend on what was typed in the mistaken command:
Understand "steal [something]" as a mistake ("Just TAKE [the noun] and leave without paying: that's stealing in my book.").
The care comes in because Inform applies much less checking to mistakes than to other actions, and odd errors will result if we try to refer to (say) "the second noun" in a command which did not have a second noun.
It's probably wise to take particular care if using "as a mistake" with any command which might include the mistake among what the player calls ALL: for example, if "take [sydney harbour bridge]" is understood as a mistake, then TAKE ALL will may result in this, even though the player doesn't intend any such thing.
|
ExampleQuery
Catching all questions that begin with WHO, WHAT, WHERE, and similar question words, and responding with the instruction to use commands, instead.
|
|
First, we create a single "[query]" token so that we can capture all instances of such sentences in a single line:
"Query"
Blank Room is a room.
Understand "who" or "what" or "when" or "where" or "why" or "how" or "who's" or "what's" or "when's" or "where's" or "why's" or "how's" as "[query]".
Understand "[query] [text]" as a mistake ("[story title] understands commands, such as '[command prompt]examine [a random thing that can be seen by the player]', but not questions. For more instructions, type HELP.").
Test me with "who am I? / who are you? / where is this place?".
Now the game will respond to all questions novice players might type with this reminder to look for help information.
"Gorge at George"
The Dusty Lot is a room. "A few miles up the road from the concert venue, but at least it's cheap to park here."
The motorcyclist is a man in the Dusty Lot. "A man clad in [a list of things worn by the motorcyclist] leans against his Harley and watches you without saying anything." The Harley is scenery in the Lot. The motorcyclist wears a black leather jacket and shades. Understand "man" or "guy" as the motorcyclist.
Understand "talk to [someone]" as a mistake ("To start a conversation, try to ASK [the noun] ABOUT something or TELL [the noun] ABOUT something.").
Instead of asking the motorcyclist about something:
say "He smirks cryptically."
Instead of telling the motorcyclist about something:
say "This does not seem to interest him much."
Test me with "talk to motorcyclist / ask motorcyclist about himself / tell motorcyclist about me".
Suppose we have a situation where the player is allowed to talk about the heat of an object only if he's properly equipped to detect it.
"Hot Glass Looks Like Cold Glass"
Use scoring.
Heat is a kind of value. The heats are hot, warm, room temperature, and cold. A thing has a heat.
Understand the heat property as referring to a thing when the player wears the infrared goggles.
The Test Kitchen is a room. "Your own personal lab, ready for scrupulously scientific recipe research. You hope. The previous three runs of this did not go well." The pair of infrared goggles is carried by the player. The description is "A pair of head-mounted IR goggles which look very foolish when worn." The goggles are wearable.
A glass dish is a kind of container. A glass dish is transparent. Three room temperature glass dishes are on the counter. Two hot glass dishes are on the counter. Two cold glass dishes are on the counter. The counter is scenery in the Test Kitchen.
Instead of doing something other than examining to a hot glass dish:
say "Ow! Crikey! You swear, and Claudia makes a sympathetic hiss. 'You're going to have a mark from that for sure,' she comments.";
decrease the score by 2.
Instead of doing something when a hot glass dish is the second noun:
say "You brush [the second noun], and wince, but manage to conceal that from Claudia.";
decrement the score.
Before printing the name of a glass dish when the player wears the goggles: say "[heat] "
Before printing the plural name of a glass dish when the player wears the goggles: say "[heat] "
So far, so good. Now, what if the player tries to GET HOT DISH when the goggles are off? "You can't see any such thing." doesn't seem like quite the right response: he can see such a thing. He just doesn't know which it is.
We could go on to write a mistake rule that would scold the player for trying "get [heat] [text]" when not wearing the goggles. The problem is that this would not cover any other phrasing of the command, nor would it account for all the many other things the player might try to do with an object specified by heat.
What we really want is to catch all instances of the player using the property name when not allowed to do so; and for this purpose we can borrow a trick from the chapter on Activities:
After reading a command:
if the player wears the goggles, make no decision;
if the player's command includes "[heat]":
say "Without the IR goggles on, you cannot tell hot things from cold at sight.";
rule succeeds.
Claudia is a woman in the Test Kitchen. "Your assistant Claudia stands by with [a list of things carried by Claudia]." The description of Claudia is "Infinitely patient and a very good stenographer. She is studiously avoiding giving you any sort of look that might be construed as mocking." Claudia carries a notepad, a brined chicken breast, a blowtorch, and a cup of heavy cream.
Instead of asking Claudia for something which is carried by Claudia:
move the second noun to the player;
say "'Check, [second noun],' repeats Claudia, in the tone of one who has seen too many medical dramas. She does hand it over, though."
Instead of asking Claudia for something:
say "She clears her throat faintly and glances at [the second noun], as though to say that it's not hers to give."
Test me with "get all / drop all / look / wear goggles / look / ask claudia for cream / put cream in hot dish / put cream in cold dish / remove goggles / get hot dish".