Import v6.12.6 of the Inform 6 standard library
[informlib.git] / english.h
1 ! ==============================================================================
2 !   ENGLISH:  Language Definition File
3 !
4 !   Supplied for use with Inform 6 -- Release 6.12.3 -- Serial number 190320
5 !
6 !   Copyright Graham Nelson 1993-2004 and David Griffith 2012-2019
7 !
8 !   This file is free software: you can redistribute it and/or modify
9 !   it under the terms of the GNU Affero General Public License as
10 !   published by the Free Software Foundation, either version 3 of the
11 !   License, or (at your option) any later version.
12 !
13 !   This file is distributed in the hope that it will be useful, but
14 !   WITHOUT ANY WARRANTY; without even the implied warranty of
15 !   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 !   Affero General Public License for more details.
17 !
18 !   You should have received a copy of the GNU Affero General Public
19 !   License along with this program. If not, see
20 !   https://gnu.org/licenses/
21 !
22 !   This file is automatically Included in your game file by "parserm".
23 !   Strictly, "parserm" includes the file named in the "language__" variable,
24 !   whose contents can be defined by+language_name=XXX compiler setting (with a
25 !   default of "english").
26 !
27 !   Define the constant DIALECT_US before including "parser" to obtain American
28 !   English.
29 ! ==============================================================================
30
31 System_file;
32
33 #Ifndef LIBRARY_ENGLISH;        ! if this file is already included,
34                                 ! don't try to include it again.
35
36 ! ------------------------------------------------------------------------------
37 !   Part I.   Preliminaries
38 ! ------------------------------------------------------------------------------
39
40 Constant EnglishNaturalLanguage;    ! Needed to keep old pronouns mechanism
41
42 Class   CompassDirection
43   with  number 0, article "the",
44         description [;
45             if (location provides compass_look && location.compass_look(self)) rtrue;
46             if (self.compass_look()) rtrue;
47             L__M(##Look, 7, self);
48         ],
49         compass_look false,
50         parse_name [; return -1; ]
51   has   scenery;
52
53 Object Compass "compass" has concealed;
54
55 #Ifndef WITHOUT_DIRECTIONS;
56 CompassDirection -> n_obj  with short_name "north",     door_dir n_to,
57                                 name 'n//' 'north';
58 CompassDirection -> s_obj  with short_name "south",     door_dir s_to,
59                                 name 's//' 'south';
60 CompassDirection -> e_obj  with short_name "east",      door_dir e_to,
61                                 name 'e//' 'east';
62 CompassDirection -> w_obj  with short_name "west",      door_dir w_to,
63                                 name 'w//' 'west';
64 CompassDirection -> ne_obj with short_name "northeast", door_dir ne_to,
65                                 name 'ne'  'northeast';
66 CompassDirection -> nw_obj with short_name "northwest", door_dir nw_to,
67                                 name 'nw'  'northwest';
68 CompassDirection -> se_obj with short_name "southeast", door_dir se_to,
69                                 name 'se'  'southeast';
70 CompassDirection -> sw_obj with short_name "southwest", door_dir sw_to,
71                                 name 'sw'  'southwest';
72 CompassDirection -> u_obj  with short_name "up above",  door_dir u_to,
73                                 name 'u//' 'up' 'ceiling' 'above' 'sky';
74 CompassDirection -> d_obj  with short_name "ground",    door_dir d_to,
75                                 name 'd//' 'down' 'floor' 'below' 'ground';
76 #endif; ! WITHOUT_DIRECTIONS
77
78 CompassDirection -> in_obj  with short_name "inside",  door_dir in_to;
79 CompassDirection -> out_obj with short_name "outside", door_dir out_to;
80
81 ! ------------------------------------------------------------------------------
82 !   Part II.   Vocabulary
83 ! ------------------------------------------------------------------------------
84
85 Constant AGAIN1__WD     = 'again';
86 Constant AGAIN2__WD     = 'g//';
87 Constant AGAIN3__WD     = 'again';
88 Constant OOPS1__WD      = 'oops';
89 Constant OOPS2__WD      = 'o//';
90 Constant OOPS3__WD      = 'oops';
91 Constant UNDO1__WD      = 'undo';
92 Constant UNDO2__WD      = 'undo';
93 Constant UNDO3__WD      = 'undo';
94
95 Constant ALL1__WD       = 'all';
96 Constant ALL2__WD       = 'each';
97 Constant ALL3__WD       = 'every';
98 Constant ALL4__WD       = 'everything';
99 Constant ALL5__WD       = 'both';
100 Constant AND1__WD       = 'and';
101 Constant AND2__WD       = 'and';
102 Constant AND3__WD       = 'and';
103 Constant BUT1__WD       = 'but';
104 Constant BUT2__WD       = 'except';
105 Constant BUT3__WD       = 'but';
106 Constant ME1__WD        = 'me';
107 Constant ME2__WD        = 'myself';
108 Constant ME3__WD        = 'self';
109 Constant OF1__WD        = 'of';
110 Constant OF2__WD        = 'of';
111 Constant OF3__WD        = 'of';
112 Constant OF4__WD        = 'of';
113 Constant OTHER1__WD     = 'another';
114 Constant OTHER2__WD     = 'other';
115 Constant OTHER3__WD     = 'other';
116 Constant THEN1__WD      = 'then';
117 Constant THEN2__WD      = 'then';
118 Constant THEN3__WD      = 'then';
119
120 Constant NO1__WD        = 'n//';
121 Constant NO2__WD        = 'no';
122 Constant NO3__WD        = 'no';
123 Constant YES1__WD       = 'y//';
124 Constant YES2__WD       = 'yes';
125 Constant YES3__WD       = 'yes';
126
127 Constant AMUSING__WD    = 'amusing';
128 Constant FULLSCORE1__WD = 'fullscore';
129 Constant FULLSCORE2__WD = 'full';
130 Constant QUIT1__WD      = 'q//';
131 Constant QUIT2__WD      = 'quit';
132 Constant RESTART__WD    = 'restart';
133 Constant RESTORE__WD    = 'restore';
134
135 Array LanguagePronouns table
136
137   ! word        possible GNAs                   connected
138   !             to follow:                      to:
139   !             a     i
140   !             s  p  s  p
141   !             mfnmfnmfnmfn
142
143     'it'      $$001000111000                    NULL
144     'him'     $$100000100000                    NULL
145     'her'     $$010000010000                    NULL
146     'them'    $$000111000111                    NULL;
147
148 Array LanguageDescriptors table
149
150   ! word        possible GNAs   descriptor      connected
151   !             to follow:      type:           to:
152   !             a     i
153   !             s  p  s  p
154   !             mfnmfnmfnmfn
155
156     'my'      $$111111111111    POSSESS_PK      0
157     'this'    $$111111111111    POSSESS_PK      0
158     'these'   $$000111000111    POSSESS_PK      0
159     'that'    $$111111111111    POSSESS_PK      1
160     'those'   $$000111000111    POSSESS_PK      1
161     'his'     $$111111111111    POSSESS_PK      'him'
162     'her'     $$111111111111    POSSESS_PK      'her'
163     'their'   $$111111111111    POSSESS_PK      'them'
164     'its'     $$111111111111    POSSESS_PK      'it'
165     'the'     $$111111111111    DEFART_PK       NULL
166     'a//'     $$111000111000    INDEFART_PK     NULL
167     'an'      $$111000111000    INDEFART_PK     NULL
168     'some'    $$000111000111    INDEFART_PK     NULL
169     'lit'     $$111111111111    light           NULL
170     'lighted' $$111111111111    light           NULL
171     'unlit'   $$111111111111    (-light)        NULL;
172
173 Array LanguageNumbers table
174     'one' 1 'two' 2 'three' 3 'four' 4 'five' 5
175     'six' 6 'seven' 7 'eight' 8 'nine' 9 'ten' 10
176     'eleven' 11 'twelve' 12 'thirteen' 13 'fourteen' 14 'fifteen' 15
177     'sixteen' 16 'seventeen' 17 'eighteen' 18 'nineteen' 19 'twenty' 20;
178
179 ! ------------------------------------------------------------------------------
180 !   Part III.   Translation
181 ! ------------------------------------------------------------------------------
182
183 [ LanguageToInformese;
184 ];
185
186 ! ------------------------------------------------------------------------------
187 !   Part IV.   Printing
188 ! ------------------------------------------------------------------------------
189
190 Constant LanguageAnimateGender   = male;
191 Constant LanguageInanimateGender = neuter;
192
193 Constant LanguageContractionForms = 2;     ! English has two:
194                                            ! 0 = starting with a consonant
195                                            ! 1 = starting with a vowel
196
197 [ LanguageContraction text;
198     if (text->0 == 'a' or 'e' or 'i' or 'o' or 'u'
199                 or 'A' or 'E' or 'I' or 'O' or 'U') return 1;
200     return 0;
201 ];
202
203 Array LanguageArticles -->
204
205  !   Contraction form 0:     Contraction form 1:
206  !   Cdef   Def    Indef     Cdef   Def    Indef
207
208      "The " "the " "a "      "The " "the " "an "          ! Articles 0
209      "The " "the " "some "   "The " "the " "some ";       ! Articles 1
210
211                    !             a           i
212                    !             s     p     s     p
213                    !             m f n m f n m f n m f n
214
215 Array LanguageGNAsToArticles --> 0 0 0 1 1 1 0 0 0 1 1 1;
216
217 [ LanguageDirection d;
218     switch (d) {
219       n_to:    print "north";
220       s_to:    print "south";
221       e_to:    print "east";
222       w_to:    print "west";
223       ne_to:   print "northeast";
224       nw_to:   print "northwest";
225       se_to:   print "southeast";
226       sw_to:   print "southwest";
227       u_to:    print "up";
228       d_to:    print "down";
229       in_to:   print "in";
230       out_to:  print "out";
231       default: return RunTimeError(9,d);
232     }
233 ];
234
235 [ LanguageNumber n f;
236     if (n == 0)    { print "zero"; rfalse; }
237     if (n < 0)     { print "minus "; n = -n; }
238     if (n >= 1000) { print (LanguageNumber) n/1000, " thousand"; n = n%1000; f = 1; }
239     if (n >= 100)  {
240         if (f == 1) print ", ";
241         print (LanguageNumber) n/100, " hundred"; n = n%100; f = 1;
242     }
243     if (n == 0) rfalse;
244     #Ifdef DIALECT_US;
245     if (f == 1) print " ";
246     #Ifnot;
247     if (f == 1) print " and ";
248     #Endif;
249     switch (n) {
250       1:    print "one";
251       2:    print "two";
252       3:    print "three";
253       4:    print "four";
254       5:    print "five";
255       6:    print "six";
256       7:    print "seven";
257       8:    print "eight";
258       9:    print "nine";
259       10:   print "ten";
260       11:   print "eleven";
261       12:   print "twelve";
262       13:   print "thirteen";
263       14:   print "fourteen";
264       15:   print "fifteen";
265       16:   print "sixteen";
266       17:   print "seventeen";
267       18:   print "eighteen";
268       19:   print "nineteen";
269       20 to 99: switch (n/10) {
270         2:  print "twenty";
271         3:  print "thirty";
272         4:  print "forty";
273         5:  print "fifty";
274         6:  print "sixty";
275         7:  print "seventy";
276         8:  print "eighty";
277         9:  print "ninety";
278         }
279         if (n%10 ~= 0) print "-", (LanguageNumber) n%10;
280     }
281 ];
282
283 [ LanguageTimeOfDay hours mins i;
284     i = hours%12;
285     if (i == 0) i = 12;
286     if (i < 10) print " ";
287     print i, ":", mins/10, mins%10;
288     if ((hours/12) > 0) print " pm"; else print " am";
289 ];
290
291 [ LanguageVerb i;
292     switch (i) {
293       'i//','inv','inventory':
294                print "take inventory";
295       'l//':   print "look";
296       'x//':   print "examine";
297       'z//':   print "wait";
298       default: rfalse;
299     }
300     rtrue;
301 ];
302
303 ! ----------------------------------------------------------------------------
304 !  LanguageVerbIsDebugging is called by SearchScope.  It should return true
305 !  if word w is a debugging verb which needs all objects to be in scope.
306 ! ----------------------------------------------------------------------------
307
308 #Ifdef DEBUG;
309 [ LanguageVerbIsDebugging w;
310     if (w == 'purloin' or 'tree' or 'abstract'
311                        or 'gonear' or 'scope' or 'showobj')
312         rtrue;
313     rfalse;
314 ];
315 #Endif;
316
317 ! ----------------------------------------------------------------------------
318 !  LanguageVerbLikesAdverb is called by PrintCommand when printing an UPTO_PE
319 !  error or an inference message.  Words which are intransitive verbs, i.e.,
320 !  which require a direction name as an adverb ('walk west'), not a noun
321 !  ('I only understood you as far as wanting to touch /the/ ground'), should
322 !  cause the routine to return true.
323 ! ----------------------------------------------------------------------------
324
325 [ LanguageVerbLikesAdverb w;
326     if (w == 'look' or 'go' or 'push' or 'walk')
327         rtrue;
328     rfalse;
329 ];
330
331 ! ----------------------------------------------------------------------------
332 !  LanguageVerbMayBeName is called by NounDomain when dealing with the
333 !  player's reply to a "Which do you mean, the short stick or the long
334 !  stick?" prompt from the parser. If the reply is another verb (for example,
335 !  LOOK) then then previous ambiguous command is discarded /unless/
336 !  it is one of these words which could be both a verb /and/ an
337 !  adjective in a 'name' property.
338 ! ----------------------------------------------------------------------------
339
340 [ LanguageVerbMayBeName w;
341     if (w == 'long' or 'short' or 'normal'
342                     or 'brief' or 'full' or 'verbose')
343         rtrue;
344     rfalse;
345 ];
346
347 Constant NKEY__TX       = "N = next subject";
348 Constant PKEY__TX       = "P = previous";
349 Constant QKEY1__TX      = "  Q = resume game";
350 Constant QKEY2__TX      = "Q = previous menu";
351 Constant RKEY__TX       = "RETURN = read subject";
352
353 Constant NKEY1__KY      = 'N';
354 Constant NKEY2__KY      = 'n';
355 Constant PKEY1__KY      = 'P';
356 Constant PKEY2__KY      = 'p';
357 Constant QKEY1__KY      = 'Q';
358 Constant QKEY2__KY      = 'q';
359
360 Constant SCORE__TX      = "Score: ";
361 Constant MOVES__TX      = "Moves: ";
362 Constant TIME__TX       = "Time: ";
363 Constant SCORE_S__TX    = "S: ";
364 Constant MOVES_S__TX    = "M: ";
365 Constant TIME_S__TX     = "T: ";
366 Constant CANTGO__TX     = "You can't go that way.";
367 Constant FORMER__TX     = "your former self";
368 Constant MYFORMER__TX   = "my former self";
369 Constant YOURSELF__TX   = "yourself";
370 Constant MYSELF__TX     = "myself";
371 Constant YOU__TX        = "You";
372 Constant DARKNESS__TX   = "Darkness";
373
374 Constant THOSET__TX     = "those things";
375 Constant THAT__TX       = "that";
376 Constant OR__TX         = " or ";
377 Constant NOTHING__TX    = "nothing";
378 Constant IS__TX         = " is";
379 Constant ARE__TX        = " are";
380 Constant IS2__TX        = "is ";
381 Constant ARE2__TX       = "are ";
382 Constant WAS__TX        = " was";
383 Constant WERE__TX       = " were";
384 Constant WAS2__TX       = "was ";
385 Constant WERE2__TX      = "were ";
386 Constant AND__TX        = " and ";
387 Constant WHOM__TX       = "whom ";
388 Constant WHICH__TX      = "which ";
389 Constant COMMA__TX      = ", ";
390 Constant COLON__TX      = ": ";
391
392 ! ----------------------------------------------------------------------------
393 ! FYI on nominative pronouns versus accusative pronouns...
394 ! Consider the sentence "She hit him.".
395 ! "She" is in the nominative case.  It appears at the beginning of a sentence.
396 ! "him" is in the accusative case.  It won't appear at the beginning.
397 ! ----------------------------------------------------------------------------
398
399 ! Accusative
400 [ ThatOrThose obj;
401     if (obj == player) {
402         if (player provides narrative_voice) {
403             if (player.narrative_voice == 1) { print "me"; return; }
404             if (player.narrative_voice == 3) { CDefart(player); return; }
405         }
406         print "you";
407         return;
408     }
409     if (obj has pluralname)       { print "those"; return; }
410     if (obj has female)           { print "her"; return; }
411     if (obj has male or animate)
412         if (obj hasnt neuter)     { print "him"; return; }
413     print "that";
414 ];
415
416 ! Accusative
417 [ ItOrThem obj;
418     if (obj == player) {
419         if (player provides narrative_voice) {
420             if (player.narrative_voice == 1) { print "myself"; return; }
421             if (player.narrative_voice == 3) { CDefart(player); return; }
422         }
423         print "yourself";
424         return;
425     }
426     if (obj has pluralname)       { print "them"; return; }
427     if (obj has female)           { print "her"; return; }
428     if (obj has male or animate)
429         if (obj hasnt neuter)     { print "him"; return; }
430     print "it";
431 ];
432
433 ! Nominative
434 [ CThatOrThose obj;
435     if (obj == player) {
436         if (player provides narrative_voice) {
437             if (player.narrative_voice == 1) { print "I"; return; }
438             if (player.narrative_voice == 3) { CDefart(player); return; }
439         }
440         print "You";
441         return;
442     }
443     if (obj has pluralname)             { print "Those"; return; }
444     if (obj has female)                 { print "She"; return; }
445     if (obj has male or animate) {
446         if (obj hasnt neuter)           { print "He"; return; }
447     }
448     print "That";
449 ];
450
451 ! Nominative
452 [ CTheyreorThats obj;
453     if (obj == player) {
454         if (player provides narrative_voice) {
455             if (player.narrative_voice == 1) { Tense("I'm", "I was"); return; }
456             if (player.narrative_voice == 3) { CDefart(player); Tense("'s", " was"); return; }
457         }
458         Tense("You're", "You were");
459         return;
460     }
461     if (obj has pluralname)             { Tense("They're", "They were"); return; }
462     if (obj has female)                 { Tense("She's", "She was"); return; }
463     if (obj has male or animate) {
464         if (obj hasnt neuter)           { Tense("He's", "He was"); return; }
465     }
466     Tense("That's", "That was");
467 ];
468
469 [ IsOrAre obj;
470     if (player provides narrative_tense && player.narrative_tense == PAST_TENSE) {
471         if (obj has pluralname || obj == player) print "were"; else print "was";
472         return;
473     }
474     if (obj has pluralname || obj == player) print "are"; else print "is";
475     return;
476 ];
477
478 [ nop x; x = x; ];      ! print rule to absorb unwanted return value
479
480 [ SubjectNotPlayer obj reportage v2 v3 past;
481     if (past && player provides narrative_tense && player.narrative_tense == PAST_TENSE) {
482         v2 = past;
483         v3 = past;
484     }
485     if (reportage && actor ~= player) {
486         L__M(##Miscellany, 60, actor);
487         if (obj == actor) {
488             print (theActor) obj, " ", (string) v3;
489             return;
490         }
491         else
492             if (obj has pluralname) {
493                 print (the) obj, " ", (string) v2;
494                 return;
495             }
496             else {print (the) obj, " ", (string) v3; return;}
497     }
498    else
499         if (obj has pluralname) { print (The) obj, " ", (string) v2; return;}
500         else                    { print (The) obj, " ", (string) v3; return;}
501 ];
502
503 [ CSubjectVoice obj v1 v2 v3 past;
504     if (past && player provides narrative_tense && player.narrative_tense == PAST_TENSE) {
505         v1 = past;
506         v2 = past;
507         v3 = past;
508     } else {
509         if (v2 == 0) v2 = v1;
510         if (v3 == 0) v3 = v1;
511     }
512     if (obj ~= player) { print (string) v3; return; }
513
514     if (player provides narrative_voice) switch (player.narrative_voice) {
515       1:  print (string) v1; return;
516       2:  ! Do nothing.
517       3:  print (string) v3; return;
518       default: RunTimeError(16, player.narrative_voice);
519     }
520
521     print (string) v2; return;
522 ];
523
524 [ CSubjectVerb obj reportage nocaps v1 v2 v3 past;
525     if (past && player provides narrative_tense && player.narrative_tense == PAST_TENSE) {
526         v1 = past;
527         v2 = past;
528         v3 = past;
529     } else {
530         if (v2 == 0) v2 = v1;
531         if (v3 == 0) v3 = v1;
532     }
533     if (obj == player) {
534         if (player provides narrative_voice) switch (player.narrative_voice) {
535           1:  print "I ", (string) v1; return;
536           2:  ! Do nothing.
537           3:  CDefart(player);
538               print " ", (string) v3; return;
539           default: RunTimeError(16, player.narrative_voice);
540         }
541         if (nocaps) { print "you ", (string) v2; return; }
542         print "You ", (string) v2; return;
543     }
544     SubjectNotPlayer(obj, reportage, v2, v3);
545 ];
546
547 [ CSubjectIs obj reportage nocaps;
548     if (obj == player) {
549         if (player provides narrative_voice) switch (player.narrative_voice) {
550           1:  Tense("I'm", "I was"); return;
551           2:  ! Do nothing.
552           3:  CDefart(player);
553               Tense(" is", " was"); return;
554           default: RunTimeError(16, player.narrative_voice);
555         }
556         if (nocaps) Tense("you're", "you were");
557         else Tense("You're", "You were");
558         return;
559     }
560     SubjectNotPlayer(obj, reportage, "are", "is", "was");
561 ];
562
563 [ CSubjectIsnt obj reportage nocaps;
564     if (obj == player) {
565         if (player provides narrative_voice) switch (player.narrative_voice) {
566           1:  Tense("I'm not", "I wasn't"); return;
567           2:  ! Do nothing.
568           3:  CDefart(player);
569               Tense(" isn't", " wasn't"); return;
570           default: RunTimeError(16, player.narrative_voice);
571         }
572         if (nocaps) Tense("you aren't", "you weren't");
573         else Tense("You aren't", "You weren't");
574         return;
575     }
576     SubjectNotPlayer(obj, reportage, "aren't", "isn't", "wasn't");
577 ];
578
579 [ CSubjectHas obj reportage nocaps;
580     if (obj == player) {
581         if (player provides narrative_voice) switch (player.narrative_voice) {
582           1:  Tense("I've", "I had"); return;
583           2:  ! Do nothing.
584           3:  CDefart(player);
585               Tense(" has", " had"); return;
586           default: RunTimeError(16, player.narrative_voice);
587         }
588         if (nocaps) Tense("you've", "you'd");
589         else Tense("You've", "You'd");
590         return;
591     }
592     SubjectNotPlayer(obj, reportage, "have", "has", "had");
593 ];
594
595 [ CSubjectWill obj reportage nocaps;
596     if (obj == player) {
597         if (player provides narrative_voice) switch (player.narrative_voice) {
598           1:  Tense("I'll", "I would"); return;
599           2:  ! Do nothing.
600           3:  CDefart(player);
601               Tense(" will", " would"); return;
602           default: RunTimeError(16, player.narrative_voice);
603         }
604         if (nocaps) Tense("you'll", "you'd");
605         else Tense("You'll", "You'd");
606         return;
607     }
608     SubjectNotPlayer(obj, reportage, "will", "will", "would");
609 ];
610
611 [ CSubjectCan obj reportage nocaps;
612     CSubjectVerb(obj, reportage, nocaps, "can", 0, "can", "could");
613 ];
614
615 [ CSubjectCant obj reportage nocaps;
616     CSubjectVerb(obj, reportage, nocaps, "can't", 0, "can't", "couldn't");
617 ];
618
619 [ CSubjectDont obj reportage nocaps;
620     CSubjectVerb(obj, reportage, nocaps, "don't", 0, "doesn't", "didn't");
621 ];
622
623
624 [ OnesSelf obj;
625     if (obj == player) {
626         if (player provides narrative_voice) switch(player.narrative_voice) {
627             1:  print (string) MYSELF__TX; return;
628             2:  ! Do nothing.
629             3:  if (obj has female) {print "herself"; return;}
630                 print "himself"; return;
631           default: RunTimeError(16, player.narrative_voice);
632         }
633         print "yourself"; return;
634     }
635     if (obj has male) { print "himself"; return; }
636     if (obj has female) {print "herself"; return; }
637     print "itself"; return;
638 ];
639
640
641 [ Possessive obj caps;
642     if (obj == player) {
643         if (player provides narrative_voice) switch(player.narrative_voice) {
644           1:  if (caps) print "M"; else print "m"; print "y"; return;
645           2:  ! Do nothing.
646           3:  CDefart(player);
647               print "'s"; return;
648           default: RunTimeError(16, player.narrative_voice);
649         }
650         if (caps) print "Y"; else print "y";
651         print "our"; return;
652     }
653     if (obj has pluralname) {
654       if (caps) print "T"; else print "t";
655       print "heir"; return;
656     }
657     if (obj has female) {
658       if (caps) print "H"; else print "h";
659       print "er"; return;
660     }
661     if (obj has male or animate) {
662       if (obj hasnt neuter) {
663         if (caps) print "H"; else print "h";
664         print "is"; return;
665       }
666     }
667     if (caps) print "I"; else { print "i"; }
668     print "ts"; return;
669 ];
670
671 [ PossessiveCaps obj;
672     Possessive(obj, true);
673 ];
674
675 [ theActor obj;
676     if (obj == player) {
677         if (obj provides narrative_voice) {
678             switch (obj.narrative_voice) {
679               1:  print "I"; return;
680               2:  ! Do nothing.
681               3:  if (obj has neuter) { print "it"; return; }
682                   if (obj has female) { print "she"; return; }
683                   print "he"; return;
684               default: RunTimeError(16, player.narrative_voice);
685             }
686         }
687         print "you"; return;
688     }
689     if (obj has pluralname)       { print "they"; return; }
690     if (obj has female)           { print "she"; return; }
691     if (obj has male or animate)
692         if (obj hasnt neuter)     { print "he"; return; }
693                                     print "that";
694 ];
695
696 [ SupportObj obj s1 s2;
697     if (obj has supporter)          print (string) s1;
698     else                            print (string) s2;
699 ];
700
701 [ PluralObj obj s1 s2 past;
702     if (player provides narrative_tense && player.narrative_tense == PAST_TENSE) {
703         print (string) past;
704         return;
705     }
706     if (obj has pluralname)         print (string) s1;
707     else                            print (string) s2;
708 ];
709
710 ! ----------------------------------------------------------------------------
711 ! Tense is a little helper function to present the correct tense of a
712 ! verb.  The first parameter is the verb in present tense.  The second
713 ! parameter is the verb in past tense.  If the second parameter is
714 ! omitted, then nothing will be printed if the appropriate tense is past.
715 ! ----------------------------------------------------------------------------
716 [ Tense present past;
717     if (player provides narrative_tense && player.narrative_tense == PAST_TENSE) {
718         if (past == false) return;
719         print (string) past;
720     }
721     else
722         print (string) present;
723 ];
724
725 [ DecideAgainst;
726     CSubjectVerb(actor, false, false, "decide",0,"decides","decided");
727     print " that";
728     Tense("'s not", " wasn't");
729     " such a good idea.";
730 ];
731
732 #Ifdef TARGET_ZCODE;
733
734 [ LowerCase c;    ! for ZSCII matching ISO 8859-1
735    switch (c) {
736      'A' to 'Z':                            c = c + 32;
737      202, 204, 212, 214, 221:               c--;
738      217, 218:                              c = c - 2;
739      158 to 160, 167, 168, 208 to 210:      c = c - 3;
740      186 to 190, 196 to 200:                c = c - 5 ;
741      175 to 180:                            c = c - 6;
742    }
743    return c;
744 ];
745
746 [ UpperCase c;    ! for ZSCII matching ISO 8859-1
747    switch (c) {
748      'a' to 'z':                            c = c - 32;
749      201, 203, 211, 213, 220:               c++;
750      215, 216:                              c = c + 2;
751      155 to 157, 164, 165, 205 to 207:      c = c + 3;
752      181 to 185, 191 to 195:                c = c + 5 ;
753      169 to 174:                            c = c + 6;
754    }
755    return c;
756 ];
757
758 #Ifnot; ! TARGET_GLULX
759
760 [ LowerCase c; return glk_char_to_lower(c); ];
761 [ UpperCase c; return glk_char_to_upper(c); ];
762
763 #Endif; ! TARGET_
764
765
766
767 [ LanguageLM n x1 x2;
768   Answer,Ask:
769             print "There ";
770             Tense("is", "was");
771             " no reply.";
772 ! Ask:      see Answer
773   Attack:   print "Violence ";
774             Tense("isn't", "wasn't");
775             " the answer to this one.";
776   Blow:     CSubjectCant(actor,true);
777             " usefully blow ", (thatorthose) x1, ".";
778   Burn: switch (n) {
779         1:  print "This dangerous act would ";
780             Tense("achieve", "have achieved");
781             " little.";
782         2:  DecideAgainst();
783     }
784   Buy:      print "Nothing ";
785             Tense("is", "was");
786             " on sale.";
787   Climb: switch (n) {
788         1:  print "Climbing ", (ThatOrThose) x1, " would ";
789             Tense("achieve", "have achieved");
790             " little.";
791         2:  DecideAgainst();
792     }
793   Close: switch (n) {
794         1:  CSubjectIs(x1,true);
795             print " not something ", (theActor) actor;
796             Tense(" can close", " could have closed");
797             ".";
798         2:  CSubjectIs(x1,true); " already closed.";
799         3:  CSubjectVerb(actor,false,false,"close",0,"closes","closed");
800             " ", (the) x1, ".";
801         4:  "(first closing ", (the) x1, ")";
802     }
803   CommandsOff: switch (n) {
804         1: "[Command recording off.]";
805         #Ifdef TARGET_GLULX;
806         2: "[Command recording already off.]";
807         #Endif; ! TARGET_
808     }
809   CommandsOn: switch (n) {
810         1: "[Command recording on.]";
811         #Ifdef TARGET_GLULX;
812         2: "[Commands are currently replaying.]";
813         3: "[Command recording already on.]";
814         4: "[Command recording failed.]";
815         #Endif; ! TARGET_
816     }
817   CommandsRead: switch (n) {
818         1: "[Replaying commands.]";
819         #Ifdef TARGET_GLULX;
820         2: "[Commands are already replaying.]";
821         3: "[Command replay failed.  Command recording is on.]";
822         4: "[Command replay failed.]";
823         5: "[Command replay complete.]";
824         #Endif; ! TARGET_
825     }
826   Consult:  CSubjectVerb(actor,true,false,"discover",0,"discovers","discovered");
827             print " nothing of interest in ";
828             if (x1 == player) { OnesSelf(x1); ".";}
829             else print_ret (the) x1, ".";
830   Cut: switch (n) {
831         1:  print "Cutting ", (ThatOrThose) x1, " up would ";
832             Tense("achieve", "have achieved");
833             " little.";
834         2:  DecideAgainst();
835     }
836   Dig:      print "Digging would ";
837             Tense("achieve", "have achieved");
838             " nothing here.";
839   Disrobe: switch (n) {
840         1:  CSubjectIsnt(actor,true); " wearing ", (ThatOrThose) x1, ".";
841         2:  CSubjectVerb(actor,false,false,"take off",0,"takes off", "took off");
842             " ", (the) x1, ".";
843     }
844   Drink:    print "There";
845             Tense("'s", " was");
846             " nothing suitable to drink here.";
847   Drop: switch (n) {
848         1:  CSubjectIs(x1,true); " already here.";
849         2:  CSubjectVerb(actor, false, false, "haven't got", 0, "hasn't got",
850                          "didn't have");
851             " ", (the) x1, ".";
852         3:  "(first taking ", (the) x1, " off)";
853         4:  "Dropped.";
854     }
855   Eat: switch (n) {
856         1:  CSubjectIs(x1,true); " plainly inedible.";
857         2:  CSubjectVerb(actor,false,false,"eat",0,"eats", "ate"); print " ", (the) x1;
858                 if (actor == player) ". Not bad."; else ".";
859     }
860   EmptyT: switch (n) {
861         1:  CSubjectCant(x1,true); " contain things.";
862         2:  CSubjectIs(x1,true); " closed.";
863         3:  CSubjectIs(x1,true); " empty already.";
864         4:  print "That wouldn't ";
865             Tense("empty", "have emptied");
866             " anything.";
867     }
868   Enter: switch (n) {
869         1:  print "But "; CSubjectIs(actor,true,true);
870             " already ", (nop) SupportObj(x1,"on ","in "), (the) x1, ".";
871         2:  CSubjectIs(x1,true);
872             print " not something ", (theActor) actor;
873             Tense(" can ", " could ");
874             switch (x2) {
875               'stand':  "stand on.";
876               'sit':    "sit down on.";
877               'lie':    "lie down on.";
878               default:  "enter.";
879             }
880         3:  CSubjectCant(actor,true);
881             " get into the closed ", (name) x1, ".";
882         4:  CSubjectCan(actor,true);
883             " only get into something free-standing.";
884         5:  CSubjectVerb(actor,false,false,"get",0,"gets","got");
885             SupportObj(x1," onto"," into"); " ", (the) x1, ".";
886         6:  "(getting ", (nop) SupportObj(x1,"off","out of"), " ", (the) x1, ")";
887         7:  if (x1 has supporter) "(getting onto ", (the) x1, ")";
888             if (x1 has container) "(getting into ", (the) x1, ")";
889                                   "(entering ", (the) x1, ")";
890     }
891   Examine: switch (n) {
892         1:  "Darkness, noun.  An absence of light to see by.";
893         2:  CSubjectVerb(actor,true,false,"see",0,"sees","saw");
894             " nothing special about ", (the) x1, ".";
895         3:  CSubjectIs(x1,true);
896             Tense(" currently");
897             print " switched ";
898             if (x1 has on) "on."; else "off.";
899     }
900   Exit: switch (n) {
901         1:  print "But ";
902             CSubjectIsnt(actor,true,true);
903             " in anything at the moment.";
904         2:  CSubjectCant(actor,false);
905             " get out of the closed ", (name) x1, ".";
906         3:  CSubjectVerb(actor,false,false,"get",0,"gets", "got");
907             print " ";
908             SupportObj(x1,"off","out of"); " ", (the) x1, ".";
909         4:  CSubjectIsnt(actor,true);
910             print " ";
911             SupportObj(x1,"on","in"); " ", (the) x1, ".";
912         5:  "(first getting ", (nop) SupportObj(x1,"off","out of"),
913               " ", (the) x1, ")";
914         6:  CSubjectVerb(actor,false,false,"stand",0,"stands","stood"); " up.";
915     }
916   Fill: switch (n) {
917         1:  print "There ";
918             Tense("isn't", "wasn't");
919             " anything obvious with which to fill ", (the) x1, ".";
920         2:  print "Filling ", (the) x1, " from ", (the) x2, " wouldn't ";
921             Tense("make", "have made");
922             " sense.";
923     }
924   FullScore: switch (n) {
925         1:  if (deadflag) print "The score was "; else print "The score is ";
926                 "made up as follows:^";
927         2:  "finding sundry items";
928         3:  "visiting various places";
929         4:  print "total (out of ", MAX_SCORE; ")";
930     }
931   GetOff:   print "But ";
932             CSubjectIsnt(actor,true,true); " on ", (the) x1, " at the moment.";
933   Give: switch (n) {
934         1:  CSubjectIsnt(actor,true); " holding ", (the) x1, ".";
935         2:  CSubjectVerb(actor,false,false,"juggle",0,"juggles","juggled");
936             print " ", (the) x1, " for a while, but ";
937             CSubjectVoice(actor,"don't","don't","doesn't","didn't");
938             " achieve much.";
939         3:  CSubjectDont(x1,true); " seem interested.";
940         4:  CSubjectVerb(actor,false,false,"hand over",0,"hands over","handed over");
941             " ", (the) x1, ".";
942     }
943   Go: switch (n) {
944         1:  CSubjectWill(actor,true);
945             Tense(" have", " have had");
946                 " to get ", (nop) SupportObj(x1,"off","out of"), " ", (the) x1, " first.";
947         2:  CSubjectCant(actor,true); " go that way.";
948         3:  CSubjectIs  (actor,true); " unable to climb ", (the) x1, ".";
949         4:  CSubjectIs  (actor,true); " unable to descend by ", (the) x1, ".";
950         5:  CSubjectCant(actor,true); " since ", (the) x1, " ", (IsOrAre) x1, " in the way.";
951         6:  CSubjectCant(actor,true); " since ", (the) x1, " ", (nop) PluralObj(x1,"lead","leads","led"), " nowhere.";
952         7:  CSubjectVerb(actor,false,false,"depart",0,"departs","departed"); ".";
953     }
954   Insert: switch (n) {
955         1:  CSubjectVerb(actor,true,false,"need",0,"needs","needed");
956             print " to be holding ", (the) x1, " before ", (theActor) actor;
957             Tense(" can", " could");
958             " put ", (ItOrThem) x1, " into something else.";
959         2:  CSubjectCant(x1,true); " contain things.";
960         3:  CSubjectIs  (x1,true); " closed.";
961         4:  CSubjectWill(actor,true);
962             Tense(" need", " have needed");
963             " to take ", (ItOrThem) x1, " off first.";
964         5:  CSubjectCant(actor,true); " put something inside itself.";
965         6:  "(first taking ", (ItOrThem) x1, " off)";
966         7:  print "There";
967             Tense(" is", " was");
968             " no more room in ", (the) x1, ".";
969         8:  "Done.";
970         9:  CSubjectVerb(actor,false,false,"put",0,"puts","put"); " ", (the) x1, " into ", (the) x2, ".";
971     }
972   Inv: switch (n) {
973         1:  CSubjectIs  (actor,false); " carrying nothing.";
974         2:  CSubjectIs  (actor,false); print " carrying";
975         3:  ":";
976         4:  ".";
977     }
978   Jump: CSubjectVerb(actor,false,false,"jump",0,"jumps","jumped"); " on the spot, fruitlessly.";
979   JumpIn: switch (n) {
980         1: print "Jumping in ", (the) x1, " ";
981            Tense("would achieve", "would have achieved");
982            " nothing here.";
983         2: DecideAgainst();
984     }
985   JumpOn: switch (n) {
986         1: print "Jumping upon ", (the) x1, " ";
987            Tense("would achieve", "would have achieved");
988            " nothing here.";
989         2: DecideAgainst();
990     }
991   JumpOver: switch (n) {
992         1: print "Jumping over ", (the) x1, " ";
993            Tense("would achieve", "would have achieved");
994            " nothing here.";
995         2:  DecideAgainst();
996     }
997   Kiss:     "Keep your mind on the game.";
998   Listen:   CSubjectVerb(actor,true,false,"hear",0,"hears","heard"); " nothing unexpected.";
999   ListMiscellany: switch (n) {
1000         1:  print " (providing light)";
1001         2:  print " (which ", (IsOrAre) x1, " closed)";
1002         3:  print " (closed and providing light)";
1003         4:  print " (which ", (IsOrAre) x1, " empty)";
1004         5:  print " (empty and providing light)";
1005         6:  print " (which ", (IsOrAre) x1, " closed and empty)";
1006         7:  print " (closed, empty and providing light)";
1007         8:  print " (providing light and being worn";
1008         9:  print " (providing light";
1009         10: print " (being worn";
1010         11: print " (which ", (IsOrAre) x1, " ";
1011         12: print "open";
1012         13: print "open but empty";
1013         14: print "closed";
1014         15: print "closed and locked";
1015         16: print " and empty";
1016         17: print " (which ", (IsOrAre) x1, " empty)";
1017         18: print " containing ";
1018         19: print " (on ";
1019         20: print ", on top of ";
1020         21: print " (in ";
1021         22: print ", inside ";
1022     }
1023   LMode1:   print (string) Story, " is now in its ";
1024             if (initial_lookmode == 1) print "normal ";
1025             "~brief~ printing mode, which gives long descriptions
1026              of places never before visited and short descriptions otherwise.";
1027   LMode2:   print (string) Story, " is now in its ";
1028             if (initial_lookmode ~= 1 or 3) print "normal ";
1029             "~verbose~ mode, which always gives long descriptions
1030              of locations (even if you've been there before).";
1031   LMode3:   print (string) Story, " is now in its ";
1032             if (initial_lookmode == 3) print "normal ";
1033             "~superbrief~ mode, which always gives short descriptions
1034              of locations (even if you haven't been there before).";
1035   Lock: switch (n) {
1036         1:  CSubjectDont(x1,true);
1037             print " seem to be something ", (theActor) actor;
1038             Tense(" can", " could");
1039             " lock.";
1040         2:  CSubjectIs  (x1,true); " locked at the moment.";
1041         3:  CSubjectWill(actor,true); " first have to close ", (the) x1, ".";
1042         4:  CSubjectDont(x1,true); " seem to fit the lock.";
1043         5:  CSubjectVerb(actor,false,false,"lock",0,"locks","locked"); " ", (the) x1, ".";
1044     }
1045   Look: switch (n) {
1046         1:  print " (on ", (the) x1, ")";
1047         2:  print " (in ", (the) x1, ")";
1048         3:  print " (as ", (object) x1, ")";
1049         4:  print "^On ", (the) x1;
1050             WriteListFrom(child(x1),
1051               ENGLISH_BIT+RECURSE_BIT+PARTINV_BIT+TERSE_BIT+CONCEAL_BIT+ISARE_BIT);
1052             ".";
1053         5,6:
1054             if (x1 ~= location) {
1055                 if (x1 has supporter) print "^On "; else print "^In ";
1056                 print (the) x1, " ", (theActor) actor, " ";
1057                 Tense("can", "could");
1058             }
1059             else { new_line; CSubjectCan(actor,false); }
1060             if (n == 5) print " also";
1061             print " see ";
1062             WriteListFrom(child(x1),
1063               ENGLISH_BIT+RECURSE_BIT+PARTINV_BIT+TERSE_BIT+CONCEAL_BIT+WORKFLAG_BIT);
1064             if (x1 ~= location) "."; else " here.";
1065         7:  CSubjectVerb(actor,true,false,"see",0,"sees", "saw"); " nothing unexpected in that direction.";
1066     }
1067   LookUnder: switch (n) {
1068         1:  print "But it";
1069             Tense("'s", " was");
1070             " dark.";
1071         2:  CSubjectVerb(actor,true,false,"find",0,"finds", "found"); " nothing of interest.";
1072     }
1073   Mild:     "Quite.";
1074   Miscellany: switch (n) {
1075         1:  "(considering the first sixteen objects only)^";
1076         2:  "Nothing to do!";
1077         3:  print " "; CSubjectVerb(player, false, false, "died", "have died", "has died");
1078             print " ";
1079         4:  print " "; CSubjectVerb(player, false, false, "won", "have won", "has won");
1080             print " ";
1081         5:  print "^Would you like to RESTART, RESTORE a saved game";
1082             #Ifdef DEATH_MENTION_UNDO;
1083             print ", UNDO your last move";
1084             #Endif;
1085             if (TASKS_PROVIDED == 0) print ", give the FULL score for that game";
1086             if (deadflag == 2 && AMUSING_PROVIDED == 0)
1087                 print ", see some suggestions for AMUSING things to do";
1088             SerialComma(3); print " or QUIT?";
1089         6:  "[Your interpreter does not provide ~undo~.  Sorry!]";
1090             #Ifdef TARGET_ZCODE;
1091         7:  "~Undo~ failed.  [Not all interpreters provide it.]";
1092             #Ifnot; ! TARGET_GLULX
1093         7:  "[You cannot ~undo~ any further.]";
1094             #Endif; ! TARGET_
1095         8:  "Please give one of the answers above.";
1096         9:  print "^It ";
1097             Tense("is now", "was");
1098             print " pitch dark in ";
1099             Tense("here", "there");
1100             "!";
1101         10: "I beg your pardon?";
1102         11: "[You can't ~undo~ what hasn't been done!]";
1103         12: "[Can't ~undo~ twice in succession. Sorry!]";
1104         13: "[Previous turn undone.]";
1105         14: "Sorry, that can't be corrected.";
1106         15: "Think nothing of it.";
1107         16: "~Oops~ can only correct a single word.";
1108         17: print "It ";
1109             Tense("is", "was");
1110             print " pitch dark, and ", (theActor) actor;
1111             Tense(" can't", " couldn't");
1112             " see a thing.";
1113         18: print "yourself";
1114         19: "As good-looking as ever.";
1115         20: "To repeat a command like ~frog, jump~, just say ~again~, not ~frog, again~.";
1116         21: CSubjectCan(actor,true); " hardly repeat that.";
1117         22: CSubjectCant(actor, true); " begin with a comma.";
1118         23: CSubjectVerb(actor, true, false, "seem", "seem", "seems", "seemed");
1119             print " to want to talk to someone, but I ";
1120             Tense("can't", "couldn't"); " see whom.";
1121         24: CSubjectCant(actor, true); " talk to ", (the) x1, ".";
1122         25: "To talk to someone, try ~someone, hello~ or some such.";
1123         26: "(first taking ", (the) x1, ")";
1124         27: "I didn't understand that sentence.";
1125         28: print "I only understood you as far as wanting to ";
1126         29: "I didn't understand that number.";
1127         30: CSubjectCant(actor,true); " see any such thing.";
1128         31: CSubjectVerb(actor, true, false, "seem", "seem", "seems", "seemed");
1129             " to have said too little!";
1130         32: CSubjectIsnt(actor); " holding that!";
1131         33: "You can't use multiple objects with that verb.";
1132         34: "You can only use multiple objects once on a line.";
1133         35: "I'm not sure what ~", (address) x1, "~ refers to.";
1134         36: "You excepted something not included anyway!";
1135         37: CSubjectCan(actor,true); " only do that to something animate.";
1136             #Ifdef DIALECT_US;
1137         38: "That's not a verb I recognize.";
1138             #Ifnot;
1139         38: "That's not a verb I recognise.";
1140             #Endif;
1141         39: "That's not something you need to refer to in the course of this game.";
1142         40: CSubjectCant(actor,true); " see ~", (address) x1, "~ (", (the) x2, ") at the moment.";
1143         41: "I didn't understand the way that finished.";
1144         42: if (x1 == 0) print "None"; else print "Only ", (number) x1;
1145             print " of those ";
1146             if (x1 == 1) print "is"; else print "are";
1147             " available.";
1148         43: "Nothing to do!";
1149         44: print "There ";
1150             Tense("is", "was");
1151             " nothing to ", (address) x1, ".";
1152         45: print "Who do you mean, ";
1153         46: print "Which do you mean, ";
1154         47: "Sorry, you can only have one item here. Which exactly?";
1155         48: print "Whom ";
1156             CSubjectVoice(player, "do", "do", "does", "did");
1157             print " ";
1158             CSubjectVerb(player, false, true, "want", "want", "want", "want");
1159             if (x1 ~= player && x1 ~= nothing) print " ", (the) x1;
1160             print " to "; PrintCommand(); "?";
1161         49: print "What ";
1162             CSubjectVoice(player, "do", "do", "does", "did");
1163             print " ";
1164             CSubjectVerb(player, false, true, "want", "want", "want", "want");
1165             if (x1 ~= player && x1 ~= nothing) print " ", (the) x1;
1166             print " to "; PrintCommand(); "?";
1167         50: print "The score has just gone ";
1168             if (x1 > 0) print "up"; else { x1 = -x1; print "down"; }
1169             print " by ", (number) x1, " point";
1170             if (x1 > 1) print "s";
1171         51: "(Since something dramatic has happened, your list of commands has been cut short.)";
1172         52: "^Type a number from 1 to ", x1, ", 0 to redisplay or press ENTER.";
1173         53: "^[Please press SPACE.]";
1174         54: "[Comment recorded.]";
1175         55: "[Comment NOT recorded.]";
1176         56: ".";
1177         57: "?";
1178         58: "(first taking ", (the) x1, " ", (nop) SupportObj(x2,"off","out of"), " ", (the) x2, ")";
1179         59: "You'll have to be more specific.";
1180         60: print (The) x1, " observes that ";
1181     }
1182   No,Yes:   "That was a rhetorical question.";
1183   NotifyOff:
1184             "Score notification off.";
1185   NotifyOn: "Score notification on.";
1186   Objects: switch (n) {
1187         1:  "Objects ", (nop) CSubjectVerb(actor, false, true, "have", "have", "has"), " handled:^";
1188         2:  "None.";
1189         3:  print "   (worn)";
1190         4:  print "   (held)";
1191         5:  print "   (given away)";
1192         6:  print "   (in ", (name) x1, ")";
1193         7:  print "   (in ", (the) x1, ")";
1194         8:  print "   (inside ", (the) x1, ")";
1195         9:  print "   (on ", (the) x1, ")";
1196         10: print "   (lost)";
1197     }
1198   Open: switch (n) {
1199         1:  CSubjectIs  (x1,true);
1200             print " not something ", (theActor) actor;
1201             Tense(" can open", " could have opened");
1202             ".";
1203         2:  CSubjectVerb(x1,true,false,"seem",0,"seems","seemed"); " to be locked.";
1204         3:  CSubjectIs  (x1,true); " already open.";
1205         4:  CSubjectVerb(actor,false,false,"open",0,"opens","opened"); print " ", (the) x1;
1206             Tense(", revealing ", " and revealed ");
1207                 if (WriteListFrom(child(x1), ENGLISH_BIT+TERSE_BIT+CONCEAL_BIT) == 0) "nothing.";
1208                 ".";
1209         5:  CSubjectVerb(actor,false,false,"open",0,"opens","opened"); " ", (the) x1, ".";
1210         6:  "(first opening ", (the) x1, ")";
1211     }
1212   Order:    CSubjectHas(x1,false); " better things to do.";
1213   Places: switch (n) {
1214         1:  print "You have visited: ";
1215         2:  ".";
1216     }
1217   Pray:     print "Nothing practical ";
1218             Tense("results", "resulted");
1219             " from ", (Possessive) actor, " prayer.";
1220   Prompt:   print "^>";
1221   Pronouns: switch (n) {
1222         1:  print "At the moment, ";
1223         2:  print "means ";
1224         3:  print "is unset";
1225         4:  "no pronouns are known to the game.";
1226         5:  ".";
1227     }
1228   Pull,Push,Turn: switch (n) {
1229         1:  if (player provides narrative_voice && player.narrative_voice == 3) {
1230                 print_ret (The) player, " ", (nop) Tense("isn't", "wasn't"),
1231                   " likely to help matters by punishing ",
1232                               (OnesSelf) player, " that way.";
1233             } else {
1234                 "Punishing ", (OnesSelf) player, " that way ",
1235                               (nop) Tense("isn't", "wasn't"), " likely to help matters.";
1236             }
1237         2:  CSubjectIs  (x1,true); " fixed in place.";
1238         3:  CSubjectIs  (actor,true); " unable to.";
1239         4:  print "Nothing obvious ";
1240             Tense("happens", "happened");
1241             ".";
1242         5:  print "That would ";
1243             Tense("be", "have been");
1244             " less than courteous.";
1245         6:  DecideAgainst();
1246     }
1247 ! Push: see Pull
1248   PushDir: switch (n) {
1249         1:  print "That really wouldn't ";
1250             Tense("serve", "have served");
1251             " any purpose.";
1252         2:  print "That's ";
1253             Tense("not", "wasn't");
1254             " a direction.";
1255         3:  print "Not that way ", (theActor) actor;
1256             Tense(" can't", "couldn't");
1257             ".";
1258     }
1259   PutOn: switch (n) {
1260         1:  CSubjectVerb(actor,true,false,"need",0,"needs","needed");
1261             print " to be holding ", (the) x1, " before ", (theActor) actor;
1262             Tense(" can", " could");
1263             " put ", (ItOrThem) x1, " on top of something else.";
1264         2:  CSubjectCant(actor,true,true); " put something on top of itself.";
1265         3:  print "Putting things on ", (the) x1, " would";
1266             Tense(" achieve", "'ve achieved");
1267             " nothing.";
1268         4:  CSubjectVerb(actor,true,false,"lack",0,"lacks","lacked"); " the dexterity.";
1269         5:  "(first taking ", (ItOrThem) x1, " off)";
1270         6:  print "There ";
1271             Tense("is", "was");
1272             " no more room on ", (the) x1, ".";
1273         7:  "Done.";
1274         8:  CSubjectVerb(actor,false,false,"put",0,"puts","put"); " ", (the) x1, " on ", (the) x2, ".";
1275     }
1276   Quit: switch (n) {
1277         1:  print "Please answer yes or no.";
1278         2:  print "Are you sure you want to quit? ";
1279     }
1280   Remove: switch (n) {
1281         1:  CSubjectIs  (x1,true); " unfortunately closed.";
1282         2:  print "But ";
1283             CSubjectIsnt(x1,true); " there now.";
1284         3:  "Removed.";
1285     }
1286   Restart: switch (n) {
1287         1:  print "Are you sure you want to restart? ";
1288         2:  "Failed.";
1289     }
1290   Restore: switch (n) {
1291         1:  "Restore failed.";
1292         2:  "Ok.";
1293     }
1294   Rub: switch (n) {
1295         1:  CSubjectVerb(actor,true,false,"achieve",0,"achieves","achieved");
1296             " nothing by this.";
1297         2:  DecideAgainst();
1298     }
1299   Save: switch (n) {
1300         1:  "Save failed.";
1301         2:  "Ok.";
1302     }
1303   Score: switch (n) {
1304         1:  if (deadflag) print "In that game you scored "; else print "You have so far scored ";
1305                 print score, " out of a possible ", MAX_SCORE, ", in ", turns, " turn";
1306                 if (turns ~= 1) print "s";
1307                 return;
1308         2:  "There is no score in this story.";
1309     }
1310   ScriptOff: switch (n) {
1311         1:  "Transcripting is already off.";
1312         2:  "^End of transcript.";
1313         3:  "Attempt to end transcript failed.";
1314     }
1315   ScriptOn: switch (n) {
1316         1:  "Transcripting is already on.";
1317         2:  print "Start of a transcript of"; VersionSub();
1318         3:  "Attempt to begin transcript failed.";
1319     }
1320   Search: switch (n) {
1321         1:  print "But it";
1322             Tense("'s", " was");
1323             " dark.";
1324         2:  print "There ";
1325             Tense("is", "was");
1326             " nothing on ", (the) x1, ".";
1327         3:  print "On ", (the) x1;
1328                 WriteListFrom(child(x1), ENGLISH_BIT+TERSE_BIT+CONCEAL_BIT+ISARE_BIT);
1329                 ".";
1330         4:  CSubjectVerb(actor,true,false,"find",0,"finds","found"); " nothing of interest.";
1331         5:  CSubjectCant(actor,true); " see inside, since ", (the) x1, " ", (IsOrAre) x1, " closed.";
1332         6:  "", (The) x1, " ", (IsOrAre) x1, " empty.";
1333
1334         7:  print "In ", (the) x1;
1335                 WriteListFrom(child(x1), ENGLISH_BIT+TERSE_BIT+CONCEAL_BIT+ISARE_BIT);
1336                 ".";
1337     }
1338    ! Preceding "No," unable to be used for Set and SetTo
1339   Set:      CSubjectCant(actor,true); " set ", (ThatOrThose) x1, ".";
1340   SetTo:    CSubjectCant(actor,true); " set ", (ThatOrThose) x1, " to anything.";
1341   Show: switch (n) {
1342         1:  CSubjectIsnt(actor,true); " holding ", (the) x1, ".";
1343         2:  CSubjectIs  (x1,true); " unimpressed.";
1344     }
1345   Sing:     print (PossessiveCaps) actor, " singing ";
1346             Tense("is", "was");
1347             " abominable.";
1348   Sleep:    CSubjectIsnt(actor,true); " feeling especially drowsy.";
1349   Smell: switch (n) {
1350         1:  CSubjectVerb(actor,true,false,"smell",0,"smells","smelled"); " nothing unexpected.";
1351         2:  DecideAgainst();
1352     }
1353             #Ifdef DIALECT_US;
1354   Sorry:    "Oh, don't apologize.";
1355             #Ifnot;
1356   Sorry:    "Oh, don't apologise.";
1357             #Endif;
1358   Squeeze: switch (n) {
1359         1:  DecideAgainst();
1360         2:  CSubjectVerb(actor,true,false,"achieve",0,"achieves","achieved"); " nothing by this.";
1361     }
1362   Strong:   print "Real adventurers ";
1363             Tense ("do", "did");
1364             " not use such language.";
1365   Swim:     print "There";
1366             Tense("'s not", " wasn't");
1367             " enough water to swim in.";
1368   Swing:    print "There";
1369             Tense("'s", " was");
1370             " nothing sensible to swing here.";
1371   SwitchOff: switch (n) {
1372         1:  CSubjectIs  (x1,true);
1373             print " not something ", (theActor) actor, " ";
1374             Tense("can", "could");
1375             " switch.";
1376         2:  CSubjectIs  (x1,true); " already off.";
1377         3:  CSubjectVerb(actor,false,false,"switch",0,"switches","switched"); " ", (the) x1, " off.";
1378     }
1379   SwitchOn: switch (n) {
1380         1:  CSubjectIs  (x1,true);
1381             print " not something ", (theActor) actor, " ";
1382             Tense("can", "could");
1383             " switch.";
1384         2:  CSubjectIs  (x1,true); " already on.";
1385         3:  CSubjectVerb(actor,false,false,"switch",0,"switches","switched"); " ", (the) x1, " on.";
1386     }
1387
1388   Take: switch (n) {
1389         1:  "Taken.";
1390         2:  CSubjectIs  (actor,false); " always self-possessed.";
1391         3:  print "I don't suppose ", (the) x1, " would ";
1392             Tense("care", "have cared");
1393             " for that.";
1394         4:  CSubjectWill(actor,true);
1395             print " have ";
1396             Tense("", "had ");
1397             "to get ", (nop) SupportObj(x1,"off","out of"), " ", (the) x1, " first.";
1398         5:  CSubjectVerb(actor,true,false,"already have",0,"already has","already had"); " ", (ThatOrThose) x1, ".";
1399         6:  CSubjectVerb(x2,true,false,"seem",0,"seems","seemed"); " to belong to ", (the) x1, ".";
1400         7:  CSubjectVerb(x2,true,false,"seem",0,"seems","seemed"); " to be a part of ", (the) x1, ".";
1401         8:  CSubjectIs  (x1,true); " not available.";
1402         9:  CSubjectIs  (x1,true); " not open.";
1403         10: CSubjectIs  (x1,true); " hardly portable.";
1404         11: CSubjectIs  (x1,true); " fixed in place.";
1405         12: CSubjectIs  (actor,true); " carrying too many things already.";
1406         13: "(putting ", (the) x1, " into ", (the) x2, " to make room)";
1407     }
1408   Taste: switch (n) {
1409         1:  CSubjectVerb(actor,true,false,"taste",0,"tastes","tasted"); " nothing unexpected.";
1410         2:  DecideAgainst();
1411     }
1412   Tell: switch (n) {
1413         1:  CSubjectVerb(actor,false,false,"talk",0,"talks","talked");
1414             " to ", (OnesSelf) actor, " for a while.";
1415         2:  print "This provoke";
1416             Tense("s", "d");
1417             " no reaction.";
1418     }
1419   Think:    "What a good idea.";
1420   ThrowAt: switch (n) {
1421         1:  "Futile.";
1422         2:  CSubjectVerb(actor,true,false,"lack",0,"lacks","lacked");
1423             print " the nerve when it ";
1424             Tense("comes", "came");
1425             " to the crucial moment.";
1426     }
1427   Tie: switch (n) {
1428         1:  CSubjectVerb(actor,true,false,"would",0,0);
1429             Tense(" achieve", " have achieved");
1430             " nothing by this.";
1431         2:  DecideAgainst();
1432     }
1433   Touch: switch (n) {
1434         1:  DecideAgainst();
1435         2:  CSubjectVerb(actor,true,false,"feel",0,"feels","felt"); " nothing unexpected.";
1436         3:  print "That really wouldn't ";
1437             Tense("serve", "have served");
1438             " any purpose.";
1439     }
1440 ! Turn: see Pull.
1441   Unlock:  switch (n) {
1442         1:  CSubjectDont(x1,true);
1443             print " seem to be something ", (theActor) actor;
1444             Tense(" can unlock", " could have unlocked");
1445             ".";
1446         2:  CSubjectIs  (x1,true); " unlocked at the moment.";
1447         3:  CSubjectDont(x1,true); " seem to fit the lock.";
1448         4:  CSubjectVerb(actor,false,false,"unlock",0,"unlocks","unlocked"); " ", (the) x1, ".";
1449         5:  "(first unlocking ", (the) x1, ")";
1450     }
1451   VagueGo:  CSubjectWill(actor);
1452             print " have ";
1453             Tense("", "had ");
1454             "to say which compass direction to go in.";
1455   Verify: switch (n) {
1456         1:  "The game file has verified as intact.";
1457         2:  "The game file did not verify as intact, and may be corrupt.";
1458     }
1459   Wait:     print "Time passe";
1460             Tense("s", "d");
1461             ".";
1462   Wake:     print "The dreadful truth is, this ";
1463             Tense("is", "was");
1464             " not a dream.";
1465   WakeOther:print "That seem";
1466             Tense("s", "ed");
1467             " unnecessary.";
1468   Wave: switch (n) {
1469         1:  print "But ";
1470             CSubjectIsnt(actor,true,true); " holding ", (ThatOrThose) x1, ".";
1471         2:  CSubjectVerb(actor,false,false,"look",0,"looks","looked");
1472             print " ridiculous waving ", (the) x1;
1473             if (x2)
1474                 " at ", (the) x2, ".";
1475             ".";
1476         3:  DecideAgainst();
1477     }
1478   WaveHands:
1479         CSubjectVerb(actor,false,false,"wave",0,"waves","waved");
1480         switch (n) {
1481         1: ! nothing
1482         2: print " at ", (the) x1;
1483         }
1484         ", feeling foolish.";
1485   Wear: switch (n) {
1486         1:  CSubjectCant(actor,true); " wear ", (ThatOrThose) x1, "!";
1487         2:  CSubjectIs  (actor,true); " not holding ", (ThatOrThose) x1, "!";
1488         3:  CSubjectIs  (actor,true); " already wearing ", (ThatOrThose) x1, "!";
1489         4:  CSubjectVerb(actor,false,false,"put on",0,"puts on","put on"); " ", (the) x1, ".";
1490     }
1491 ! Yes:  see No.
1492 ];
1493
1494 ! ==============================================================================
1495
1496 Constant LIBRARY_ENGLISH;       ! for dependency checking.
1497 #Endif;
1498
1499 ! ==============================================================================