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.6 -- Serial number 220219
5 !
6 !   Copyright Graham Nelson 1993-2004 and David Griffith 2012-2022
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 ! CompassDirection
299       'n//':   print "north";
300       's//':   print "south";
301       'e//':   print "east";
302       'w//':   print "west";
303       'ne//':   print "northeast";
304       'nw//':   print "northwest";
305       'se//':   print "southeast";
306       'sw//':   print "southwest";
307       default: rfalse;
308     }
309     rtrue;
310 ];
311
312 ! ----------------------------------------------------------------------------
313 !  LanguageVerbIsDebugging is called by SearchScope.  It should return true
314 !  if word w is a debugging verb which needs all objects to be in scope.
315 ! ----------------------------------------------------------------------------
316
317 #Ifdef DEBUG;
318 [ LanguageVerbIsDebugging w;
319     if (w == 'purloin' or 'tree' or 'abstract'
320                        or 'gonear' or 'scope' or 'showobj')
321         rtrue;
322     rfalse;
323 ];
324 #Endif;
325
326 ! ----------------------------------------------------------------------------
327 !  LanguageVerbLikesAdverb is called by PrintCommand when printing an UPTO_PE
328 !  error or an inference message.  Words which are intransitive verbs, i.e.,
329 !  which require a direction name as an adverb ('walk west'), not a noun
330 !  ('I only understood you as far as wanting to touch /the/ ground'), should
331 !  cause the routine to return true.
332 ! ----------------------------------------------------------------------------
333
334 [ LanguageVerbLikesAdverb w;
335     if (w == 'look' or 'go' or 'run' or 'leave' or 'l//' or 'push' or 'walk')
336         rtrue;
337     rfalse;
338 ];
339
340 ! ----------------------------------------------------------------------------
341 !  LanguageVerbMayBeName is called by NounDomain when dealing with the
342 !  player's reply to a "Which do you mean, the short stick or the long
343 !  stick?" prompt from the parser. If the reply is another verb (for example,
344 !  LOOK) then then previous ambiguous command is discarded /unless/
345 !  it is one of these words which could be both a verb /and/ an
346 !  adjective in a 'name' property.
347 ! ----------------------------------------------------------------------------
348
349 [ LanguageVerbMayBeName w;
350     if (w == 'long' or 'short' or 'normal'
351                     or 'brief' or 'full' or 'verbose')
352         rtrue;
353     rfalse;
354 ];
355
356 Constant NKEY__TX       = "N = next subject";
357 Constant PKEY__TX       = "P = previous";
358 Constant QKEY1__TX      = "  Q = resume game";
359 Constant QKEY2__TX      = "Q = previous menu";
360 Constant RKEY__TX       = "RETURN = read subject";
361
362 Constant NKEY1__KY      = 'N';
363 Constant NKEY2__KY      = 'n';
364 Constant PKEY1__KY      = 'P';
365 Constant PKEY2__KY      = 'p';
366 Constant QKEY1__KY      = 'Q';
367 Constant QKEY2__KY      = 'q';
368
369 Constant SCORE__TX      = "Score: ";
370 Constant MOVES__TX      = "Moves: ";
371 Constant TIME__TX       = "Time: ";
372 Constant SCORE_S__TX    = "S: ";
373 Constant MOVES_S__TX    = "M: ";
374 Constant TIME_S__TX     = "T: ";
375 Constant CANTGO__TX     = "You can't go that way.";
376 Constant FORMER__TX     = "your former self";
377 Constant MYFORMER__TX   = "my former self";
378 Constant YOURSELF__TX   = "yourself";
379 Constant MYSELF__TX     = "myself";
380 Constant YOU__TX        = "You";
381 Constant DARKNESS__TX   = "Darkness";
382
383 Constant THOSET__TX     = "those things";
384 Constant THAT__TX       = "that";
385 Constant THE__TX        = "the";
386 Constant OR__TX         = " or ";
387 Constant NOTHING__TX    = "nothing";
388 Constant IS__TX         = " is";
389 Constant ARE__TX        = " are";
390 Constant IS2__TX        = "is ";
391 Constant ARE2__TX       = "are ";
392 Constant WAS__TX        = " was";
393 Constant WERE__TX       = " were";
394 Constant WAS2__TX       = "was ";
395 Constant WERE2__TX      = "were ";
396 Constant AND__TX        = " and ";
397 Constant WHOM__TX       = "whom ";
398 Constant WHICH__TX      = "which ";
399 Constant COMMA__TX      = ", ";
400 Constant COLON__TX      = ":";
401
402 ! For EnterSub()
403 Constant STAND__TX      = 'stand';
404 Constant SIT__TX        = 'sit';
405 Constant LIE__TX        = 'lie';
406
407 Constant LIBERROR__TX   = "Library error ";
408 Constant TERP__TX       = "Interpreter ";
409 Constant VER__TX        = "Version ";
410 Constant STDTERP__TX    = "Standard interpreter ";
411 Constant TERPVER__TX    = "Interpreter version ";
412 Constant LIBSER__TX     = "Library Serial Number ";
413 Constant VM__TX         = "VM ";
414 Constant RELEASE__TX    = "Release ";
415 Constant SERNUM__TX     = "Serial number ";
416 Constant INFORMV__TX    = "Inform v";
417 Constant LIBRARYV__TX   = " Library v";
418
419 ! ----------------------------------------------------------------------------
420 ! FYI on nominative pronouns versus accusative pronouns...
421 ! Consider the sentence "She hit him.".
422 ! "She" is in the nominative case.  It appears at the beginning of a sentence.
423 ! "him" is in the accusative case.  It won't appear at the beginning.
424 ! ----------------------------------------------------------------------------
425
426 ! Accusative
427 [ ThatOrThose obj;
428     if (obj == player) {
429         if (player provides narrative_voice) {
430             if (player.narrative_voice == 1) { print "me"; return; }
431             if (player.narrative_voice == 3) { CDefart(player); return; }
432         }
433         print "you";
434         return;
435     }
436     if (obj has pluralname)       { print "those"; return; }
437     if (obj has female)           { print "her"; return; }
438     if (obj has male or animate)
439         if (obj hasnt neuter)     { print "him"; return; }
440     print "that";
441 ];
442
443 ! Accusative
444 [ ItOrThem obj;
445     if (obj == player) {
446         if (player provides narrative_voice) {
447             if (player.narrative_voice == 1) { print "myself"; return; }
448             if (player.narrative_voice == 3) { CDefart(player); return; }
449         }
450         print "yourself";
451         return;
452     }
453     if (obj has pluralname)       { print "them"; return; }
454     if (obj has female)           { print "her"; return; }
455     if (obj has male or animate)
456         if (obj hasnt neuter)     { print "him"; return; }
457     print "it";
458 ];
459
460 ! Nominative
461 [ CThatOrThose obj;
462     if (obj == player) {
463         if (player provides narrative_voice) {
464             if (player.narrative_voice == 1) { print "I"; return; }
465             if (player.narrative_voice == 3) { CDefart(player); return; }
466         }
467         print "You";
468         return;
469     }
470     if (obj has pluralname)             { print "Those"; return; }
471     if (obj has female)                 { print "She"; return; }
472     if (obj has male or animate) {
473         if (obj hasnt neuter)           { print "He"; return; }
474     }
475     print "That";
476 ];
477
478 ! Nominative
479 [ CTheyreOrThats obj;
480     if (obj == player) {
481         if (player provides narrative_voice) {
482             if (player.narrative_voice == 1) { Tense("I'm", "I was"); return; }
483             if (player.narrative_voice == 3) { CDefart(player); Tense("'s", " was"); return; }
484         }
485         Tense("You're", "You were");
486         return;
487     }
488     if (obj has pluralname)             { Tense("They're", "They were"); return; }
489     if (obj has female)                 { Tense("She's", "She was"); return; }
490     if (obj has male or animate) {
491         if (obj hasnt neuter)           { Tense("He's", "He was"); return; }
492     }
493     Tense("That's", "That was");
494 ];
495
496 [ IsOrAre obj;
497     if (player provides narrative_tense && player.narrative_tense == PAST_TENSE) {
498         if (obj has pluralname || obj == player) print "were"; else print "was";
499         return;
500     }
501     if (obj has pluralname || obj == player) print "are"; else print "is";
502     return;
503 ];
504
505 [ nop x; x = x; ];      ! print rule to absorb unwanted return value
506
507 [ SubjectNotPlayer obj reportage nocaps v2 v3 past;
508     if (past && player provides narrative_tense && player.narrative_tense == PAST_TENSE) {
509         v2 = past;
510         v3 = past;
511     }
512     if (reportage && actor ~= player) {
513         L__M(##Miscellany, 60, actor);
514         if (obj == actor) {
515             print (theActor) obj, " ", (string) v3;
516             return;
517         }
518         else
519             if (obj has pluralname) {
520                 print (the) obj, " ", (string) v2;
521                 return;
522             }
523             else {print (the) obj, " ", (string) v3; return;}
524     }
525    else
526         if (obj has pluralname) {
527             if (nocaps)
528                 print (the) obj;
529             else
530                 print (The) obj;
531             print " ", (string) v2;
532             return;
533         }
534         else {
535             if (nocaps)
536                 print (the) obj;
537             else
538                 print (The) obj;
539             print " ", (string) v3; return;
540         }
541 ];
542
543 [ CSubjectVoice obj v1 v2 v3 past;
544     if (past && player provides narrative_tense && player.narrative_tense == PAST_TENSE) {
545         v1 = past;
546         v2 = past;
547         v3 = past;
548     } else {
549         if (v2 == 0) v2 = v1;
550         if (v3 == 0) v3 = v1;
551     }
552     if (obj ~= player) { print (string) v3; return; }
553
554     if (player provides narrative_voice) switch (player.narrative_voice) {
555       1:  print (string) v1; return;
556       2:  ! Do nothing.
557       3:  print (string) v3; return;
558       default: RunTimeError(16, player.narrative_voice);
559     }
560
561     print (string) v2; return;
562 ];
563
564 [ CSubjectVerb obj reportage nocaps v1 v2 v3 past;
565     if (past && player provides narrative_tense && player.narrative_tense == PAST_TENSE) {
566         v1 = past;
567         v2 = past;
568         v3 = past;
569     } else {
570         if (v2 == 0) v2 = v1;
571         if (v3 == 0) v3 = v1;
572     }
573     if (obj == player) {
574         if (player provides narrative_voice) switch (player.narrative_voice) {
575           1:  print "I ", (string) v1; return;
576           2:  ! Do nothing.
577           3:  CDefart(player);
578               print " ", (string) v3; return;
579           default: RunTimeError(16, player.narrative_voice);
580         }
581         if (nocaps) { print "you ", (string) v2; return; }
582         print "You ", (string) v2; return;
583     }
584     SubjectNotPlayer(obj, reportage, nocaps, v2, v3);
585 ];
586
587 [ CSubjectIs obj reportage nocaps;
588     if (obj == player) {
589         if (player provides narrative_voice) switch (player.narrative_voice) {
590           1:  Tense("I'm", "I was"); return;
591           2:  ! Do nothing.
592           3:  CDefart(player);
593               Tense(" is", " was"); return;
594           default: RunTimeError(16, player.narrative_voice);
595         }
596         if (nocaps) Tense("you're", "you were");
597         else Tense("You're", "You were");
598         return;
599     }
600     SubjectNotPlayer(obj, reportage, nocaps, "are", "is", "was");
601 ];
602
603 [ CSubjectIsnt obj reportage nocaps;
604     if (obj == player) {
605         if (player provides narrative_voice) switch (player.narrative_voice) {
606           1:  Tense("I'm not", "I wasn't"); return;
607           2:  ! Do nothing.
608           3:  CDefart(player);
609               Tense(" isn't", " wasn't"); return;
610           default: RunTimeError(16, player.narrative_voice);
611         }
612         if (nocaps) Tense("you aren't", "you weren't");
613         else Tense("You aren't", "You weren't");
614         return;
615     }
616     SubjectNotPlayer(obj, reportage, nocaps, "aren't", "isn't", "wasn't");
617 ];
618
619 [ CSubjectHas obj reportage nocaps;
620     if (obj == player) {
621         if (player provides narrative_voice) switch (player.narrative_voice) {
622           1:  Tense("I've", "I had"); return;
623           2:  ! Do nothing.
624           3:  CDefart(player);
625               Tense(" has", " had"); return;
626           default: RunTimeError(16, player.narrative_voice);
627         }
628         if (nocaps) Tense("you've", "you'd");
629         else Tense("You've", "You'd");
630         return;
631     }
632     SubjectNotPlayer(obj, reportage, nocaps, "have", "has", "had");
633 ];
634
635 [ CSubjectWill obj reportage nocaps;
636     if (obj == player) {
637         if (player provides narrative_voice) switch (player.narrative_voice) {
638           1:  Tense("I'll", "I would"); return;
639           2:  ! Do nothing.
640           3:  CDefart(player);
641               Tense(" will", " would"); return;
642           default: RunTimeError(16, player.narrative_voice);
643         }
644         if (nocaps) Tense("you'll", "you'd");
645         else Tense("You'll", "You'd");
646         return;
647     }
648     SubjectNotPlayer(obj, reportage, nocaps, "will", "will", "would");
649 ];
650
651 [ CSubjectCan obj reportage nocaps;
652     CSubjectVerb(obj, reportage, nocaps, "can", 0, "can", "could");
653 ];
654
655 [ CSubjectCant obj reportage nocaps;
656     CSubjectVerb(obj, reportage, nocaps, "can't", 0, "can't", "couldn't");
657 ];
658
659 [ CSubjectDont obj reportage nocaps;
660     CSubjectVerb(obj, reportage, nocaps, "don't", 0, "doesn't", "didn't");
661 ];
662
663
664 [ OnesSelf obj;
665     if (obj == player) {
666         if (player provides narrative_voice) switch(player.narrative_voice) {
667             1:  print (string) MYSELF__TX; return;
668             2:  ! Do nothing.
669             3:  if (obj has female) {print "herself"; return;}
670                 print "himself"; return;
671           default: RunTimeError(16, player.narrative_voice);
672         }
673         print "yourself"; return;
674     }
675     if (obj has male) { print "himself"; return; }
676     if (obj has female) {print "herself"; return; }
677     print "itself"; return;
678 ];
679
680
681 [ Possessive obj caps;
682     if (obj == player) {
683         if (player provides narrative_voice) switch(player.narrative_voice) {
684           1:  if (caps) print "M"; else print "m"; print "y"; return;
685           2:  ! Do nothing.
686           3:  CDefart(player);
687               print "'s"; return;
688           default: RunTimeError(16, player.narrative_voice);
689         }
690         if (caps) print "Y"; else print "y";
691         print "our"; return;
692     }
693     if (obj has pluralname) {
694       if (caps) print "T"; else print "t";
695       print "heir"; return;
696     }
697     if (obj has female) {
698       if (caps) print "H"; else print "h";
699       print "er"; return;
700     }
701     if (obj has male or animate) {
702       if (obj hasnt neuter) {
703         if (caps) print "H"; else print "h";
704         print "is"; return;
705       }
706     }
707     if (caps) print "I"; else { print "i"; }
708     print "ts"; return;
709 ];
710
711 [ PossessiveCaps obj;
712     Possessive(obj, true);
713 ];
714
715 [ theActor obj;
716     if (obj == player) {
717         if (obj provides narrative_voice) {
718             switch (obj.narrative_voice) {
719               1:  print "I"; return;
720               2:  ! Do nothing.
721               3:  if (obj has neuter) { print "it"; return; }
722                   if (obj has female) { print "she"; return; }
723                   print "he"; return;
724               default: RunTimeError(16, player.narrative_voice);
725             }
726         }
727         print "you"; return;
728     }
729     if (obj has pluralname)       { print "they"; return; }
730     if (obj has female)           { print "she"; return; }
731     if (obj has male or animate)
732         if (obj hasnt neuter)     { print "he"; return; }
733                                     print "that";
734 ];
735
736 [ SupportObj obj s1 s2;
737     if (obj has supporter)          print (string) s1;
738     else                            print (string) s2;
739 ];
740
741 [ PluralObj obj s1 s2 past;
742     if (player provides narrative_tense && player.narrative_tense == PAST_TENSE) {
743         print (string) past;
744         return;
745     }
746     if (obj has pluralname)         print (string) s1;
747     else                            print (string) s2;
748 ];
749
750 ! ----------------------------------------------------------------------------
751 ! Tense is a little helper function to present the correct tense of a
752 ! verb.  The first parameter is the verb in present tense.  The second
753 ! parameter is the verb in past tense.  If the second parameter is
754 ! omitted, then nothing will be printed if the appropriate tense is past.
755 ! ----------------------------------------------------------------------------
756 [ Tense present past;
757     if (player provides narrative_tense && player.narrative_tense == PAST_TENSE) {
758         if (past == false) return;
759         print (string) past;
760     }
761     else
762         print (string) present;
763 ];
764
765 [ DecideAgainst;
766     CSubjectVerb(actor, false, false, "decide",0,"decides","decided");
767     print " that";
768     Tense("'s not", " wasn't");
769     " such a good idea.";
770 ];
771
772 #Ifdef TARGET_ZCODE;
773
774 [ LowerCase c;    ! for ZSCII matching ISO 8859-1
775    switch (c) {
776      'A' to 'Z':                            c = c + 32;
777      202, 204, 212, 214, 221:               c--;
778      217, 218:                              c = c - 2;
779      158 to 160, 167, 168, 208 to 210:      c = c - 3;
780      186 to 190, 196 to 200:                c = c - 5 ;
781      175 to 180:                            c = c - 6;
782    }
783    return c;
784 ];
785
786 [ UpperCase c;    ! for ZSCII matching ISO 8859-1
787    switch (c) {
788      'a' to 'z':                            c = c - 32;
789      201, 203, 211, 213, 220:               c++;
790      215, 216:                              c = c + 2;
791      155 to 157, 164, 165, 205 to 207:      c = c + 3;
792      181 to 185, 191 to 195:                c = c + 5 ;
793      169 to 174:                            c = c + 6;
794    }
795    return c;
796 ];
797
798 #Ifnot; ! TARGET_GLULX
799
800 [ LowerCase c; return glk_char_to_lower(c); ];
801 [ UpperCase c; return glk_char_to_upper(c); ];
802
803 #Endif; ! TARGET_
804
805
806
807 [ LanguageLM n x1 x2;
808   Answer,Ask:
809             print "There ";
810             Tense("is", "was");
811             " no reply.";
812 ! Ask:      see Answer
813   Attack:   print "Violence ";
814             Tense("isn't", "wasn't");
815             " the answer to this one.";
816   Blow:     CSubjectCant(actor,true);
817             " usefully blow ", (thatorthose) x1, ".";
818   Burn: switch (n) {
819         1:  print "This dangerous act would ";
820             Tense("achieve", "have achieved");
821             " little.";
822         2:  DecideAgainst();
823     }
824   Buy:      print "Nothing ";
825             Tense("is", "was");
826             " on sale.";
827   Climb: switch (n) {
828         1:  print "Climbing ", (ThatOrThose) x1, " would ";
829             Tense("achieve", "have achieved");
830             " little.";
831         2:  DecideAgainst();
832     }
833   Close: switch (n) {
834         1:  CSubjectIs(x1,true);
835             print " not something ", (theActor) actor;
836             Tense(" can close", " could have closed");
837             ".";
838         2:  CSubjectIs(x1,true); " already closed.";
839         3:  CSubjectVerb(actor,false,false,"close",0,"closes","closed");
840             " ", (the) x1, ".";
841         4:  "(first closing ", (the) x1, ")";
842     }
843   CommandsOff: switch (n) {
844         1: "[Command recording off.]";
845         #Ifdef TARGET_GLULX;
846         2: "[Command recording already off.]";
847         #Endif; ! TARGET_
848     }
849   CommandsOn: switch (n) {
850         1: "[Command recording on.]";
851         #Ifdef TARGET_GLULX;
852         2: "[Commands are currently replaying.]";
853         3: "[Command recording already on.]";
854         4: "[Command recording failed.]";
855         #Endif; ! TARGET_
856     }
857   CommandsRead: switch (n) {
858         1: "[Replaying commands.]";
859         #Ifdef TARGET_GLULX;
860         2: "[Commands are already replaying.]";
861         3: "[Command replay failed.  Command recording is on.]";
862         4: "[Command replay failed.]";
863         5: "[Command replay complete.]";
864         #Endif; ! TARGET_
865     }
866   Consult:  CSubjectVerb(actor,true,false,"discover",0,"discovers","discovered");
867             print " nothing of interest in ";
868             if (x1 == player) { OnesSelf(x1); ".";}
869             else print_ret (the) x1, ".";
870   Cut: switch (n) {
871         1:  print "Cutting ", (ThatOrThose) x1, " up would ";
872             Tense("achieve", "have achieved");
873             " little.";
874         2:  DecideAgainst();
875     }
876   Dig:      print "Digging would ";
877             Tense("achieve", "have achieved");
878             " nothing here.";
879   Disrobe: switch (n) {
880         1:  CSubjectIsnt(actor,true); " wearing ", (ThatOrThose) x1, ".";
881         2:  CSubjectVerb(actor,false,false,"take off",0,"takes off", "took off");
882             " ", (the) x1, ".";
883         3:  "(first taking ", (the) x1, " off)";
884         4: CSubjectVerb(actor,false,false, "will need to", 0, 0, "had to");
885            " remove ", (the) noun, " first.";
886     }
887   Drink:    print "There";
888             Tense("'s", " was");
889             " nothing suitable to drink here.";
890   Drop: switch (n) {
891         1:  CSubjectIs(x1,true); " already here.";
892         2:  CSubjectVerb(actor, false, false, "haven't got", 0, "hasn't got",
893                          "didn't have");
894             " ", (the) x1, ".";
895         3:  "Dropped.";
896         4: CSubjectVerb(actor, false, false, "need to take", 0, 0, "had to take");
897            print " ", (the) x1, " ";
898            if (x2 has container)
899                print "out";
900            else
901                print "off";
902            " of ", (the) x2, " before dropping ", (ItOrThem) x1, ".";
903     }
904   Eat: switch (n) {
905         1:  CSubjectIs(x1,true); " plainly inedible.";
906         2:  CSubjectVerb(actor,false,false,"eat",0,"eats", "ate"); print " ", (the) x1;
907                 if (actor == player) ". Not bad."; else ".";
908     }
909   EmptyT: switch (n) {
910         1:  CSubjectCant(x1,true); " contain things.";
911         2:  CSubjectIs(x1,true); " closed.";
912         3:  CSubjectIs(x1,true); " empty already.";
913         4:  print "That wouldn't ";
914             Tense("empty", "have emptied");
915             " anything.";
916     }
917   Enter: switch (n) {
918         1:  print "But "; CSubjectIs(actor,true,true);
919             " already ", (nop) SupportObj(x1,"on ","in "), (the) x1, ".";
920         2:  CSubjectIs(x1,true);
921             print " not something ", (theActor) actor;
922             Tense(" can ", " could ");
923             switch (x2) {
924               'stand':  "stand on.";
925               'sit':    "sit down on.";
926               'lie':    "lie down on.";
927               default:  "enter.";
928             }
929         3:  CSubjectCant(actor,true);
930             " get into the closed ", (name) x1, ".";
931         4:  CSubjectCan(actor,true);
932             " only get into something free-standing.";
933         5:  CSubjectVerb(actor,false,false,"get",0,"gets","got");
934             SupportObj(x1," onto"," into"); " ", (the) x1, ".";
935         6:  "(getting ", (nop) SupportObj(x1,"off","out of"), " ", (the) x1, ")";
936         7:  if (x1 has supporter) "(getting onto ", (the) x1, ")";
937             if (x1 has container) "(getting into ", (the) x1, ")";
938                                   "(entering ", (the) x1, ")";
939     }
940   Examine: switch (n) {
941         1:  "Darkness, noun.  An absence of light to see by.";
942         2:  CSubjectVerb(actor,true,false,"see",0,"sees","saw");
943             " nothing special about ", (the) x1, ".";
944         3:  CSubjectIs(x1,true);
945             Tense(" currently");
946             print " switched ";
947             if (x1 has on) "on."; else "off.";
948     }
949   Exit: switch (n) {
950         1:  print "But ";
951             CSubjectIsnt(actor,true,true);
952             " in anything at the moment.";
953         2:  CSubjectCant(actor,false);
954             " get out of the closed ", (name) x1, ".";
955         3:  CSubjectVerb(actor,false,false,"get",0,"gets", "got");
956             print " ";
957             SupportObj(x1,"off","out of"); " ", (the) x1, ".";
958         4:  CSubjectIsnt(actor,true);
959             print " ";
960             SupportObj(x1,"on","in"); " ", (the) x1, ".";
961         5:  "(first getting ", (nop) SupportObj(x1,"off","out of"),
962               " ", (the) x1, ")";
963         6:  CSubjectVerb(actor,false,false,"stand",0,"stands","stood"); " up.";
964     }
965   Fill: switch (n) {
966         1:  print "There ";
967             Tense("isn't", "wasn't");
968             " anything obvious with which to fill ", (the) x1, ".";
969         2:  print "Filling ", (the) x1, " from ", (the) x2, " wouldn't ";
970             Tense("make", "have made");
971             " sense.";
972     }
973   FullScore: switch (n) {
974         1:  if (deadflag) print "The score was "; else print "The score is ";
975                 "made up as follows:^";
976         2:  "finding sundry items";
977         3:  "visiting various places";
978         4:  print "total (out of ", MAX_SCORE; ")";
979     }
980   GetOff:   print "But ";
981             CSubjectIsnt(actor,true,true); " on ", (the) x1, " at the moment.";
982   Give: switch (n) {
983         1:  CSubjectIsnt(actor,true); " holding ", (the) x1, ".";
984         2:  CSubjectVerb(actor,false,false,"juggle",0,"juggles","juggled");
985             print " ", (the) x1, " for a while, but ";
986             CSubjectVoice(actor,"don't","don't","doesn't","didn't");
987             " achieve much.";
988         3:  CSubjectDont(x1,true); " seem interested.";
989         4:  CSubjectVerb(actor,false,false,"hand over",0,"hands over","handed over");
990             " ", (the) x1, ".";
991     }
992   Go: switch (n) {
993         1:  CSubjectWill(actor,true);
994             Tense(" have", " have had");
995                 " to get ", (nop) SupportObj(x1,"off","out of"), " ", (the) x1, " first.";
996         2:  CSubjectCant(actor,true); " go that way.";
997         3:  CSubjectIs  (actor,true); " unable to climb ", (the) x1, ".";
998         4:  CSubjectIs  (actor,true); " unable to descend by ", (the) x1, ".";
999         5:  CSubjectCant(actor,true); " since ", (the) x1, " ", (IsOrAre) x1, " in the way.";
1000         6:  CSubjectCant(actor,true); " since ", (the) x1, " ", (nop) PluralObj(x1,"lead","leads","led"), " nowhere.";
1001         7:  CSubjectVerb(actor,false,false,"depart",0,"departs","departed"); ".";
1002     }
1003   Insert: switch (n) {
1004         1:  CSubjectVerb(actor,true,false,"need",0,"needs","needed");
1005             print " to be holding ", (the) x1, " before ", (theActor) actor;
1006             Tense(" can", " could");
1007             " put ", (ItOrThem) x1, " into something else.";
1008         2:  CSubjectCant(x1,true); " contain things.";
1009         3:  CSubjectIs  (x1,true); " closed.";
1010         4:  CSubjectWill(actor,true);
1011             Tense(" need", " have needed");
1012             " to take ", (ItOrThem) x1, " off first.";
1013         5:  CSubjectCant(actor,true); " put something inside itself.";
1014         6:  "(first taking ", (ItOrThem) x1, " off)";
1015         7:  print "There";
1016             Tense(" is", " was");
1017             " no more room in ", (the) x1, ".";
1018         8:  "Done.";
1019         9:  CSubjectVerb(actor,false,false,"put",0,"puts","put"); " ", (the) x1, " into ", (the) x2, ".";
1020     }
1021   Inv: switch (n) {
1022         1:  CSubjectIs  (actor,false); " carrying nothing.";
1023         2:  CSubjectIs  (actor,false); print " carrying";
1024         3:  ":";
1025         4:  ".";
1026     }
1027   Jump: CSubjectVerb(actor,false,false,"jump",0,"jumps","jumped"); " on the spot, fruitlessly.";
1028   JumpIn: switch (n) {
1029         1: print "Jumping in ", (the) x1, " ";
1030            Tense("would achieve", "would have achieved");
1031            " nothing here.";
1032         2: DecideAgainst();
1033     }
1034   JumpOn: switch (n) {
1035         1: print "Jumping upon ", (the) x1, " ";
1036            Tense("would achieve", "would have achieved");
1037            " nothing here.";
1038         2: DecideAgainst();
1039     }
1040   JumpOver: switch (n) {
1041         1: print "Jumping over ", (the) x1, " ";
1042            Tense("would achieve", "would have achieved");
1043            " nothing here.";
1044         2:  DecideAgainst();
1045     }
1046   Kiss:     "Keep your mind on the game.";
1047   Listen:   CSubjectVerb(actor,true,false,"hear",0,"hears","heard"); " nothing unexpected.";
1048   ListMiscellany: switch (n) {
1049         1:  print " (providing light)";
1050         2:  print " (which ", (IsOrAre) x1, " closed)";
1051         3:  print " (closed and providing light)";
1052         4:  print " (which ", (IsOrAre) x1, " empty)";
1053         5:  print " (empty and providing light)";
1054         6:  print " (which ", (IsOrAre) x1, " closed and empty)";
1055         7:  print " (closed, empty and providing light)";
1056         8:  print " (providing light and being worn";
1057         9:  print " (providing light";
1058         10: print " (being worn";
1059         11: print " (which ", (IsOrAre) x1, " ";
1060         12: print "open";
1061         13: print "open but empty";
1062         14: print "closed";
1063         15: print "closed and locked";
1064         16: print " and empty";
1065         17: print " (which ", (IsOrAre) x1, " empty)";
1066         18: print " containing ";
1067         19: print " (on ";
1068         20: print ", on top of ";
1069         21: print " (in ";
1070         22: print ", inside ";
1071     }
1072   LMode1:   print (string) Story, " is now in its ";
1073             if (initial_lookmode == 1) print "normal ";
1074             "~brief~ printing mode, which gives long descriptions
1075              of places never before visited and short descriptions otherwise.";
1076   LMode2:   print (string) Story, " is now in its ";
1077             if (initial_lookmode ~= 1 or 3) print "normal ";
1078             "~verbose~ mode, which always gives long descriptions
1079              of locations (even if you've been there before).";
1080   LMode3:   print (string) Story, " is now in its ";
1081             if (initial_lookmode == 3) print "normal ";
1082             "~superbrief~ mode, which always gives short descriptions
1083              of locations (even if you haven't been there before).";
1084   Lock: switch (n) {
1085         1:  CSubjectDont(x1,true);
1086             print " seem to be something ", (theActor) actor;
1087             Tense(" can", " could");
1088             " lock.";
1089         2:  CSubjectIs  (x1,true); " locked at the moment.";
1090         3:  CSubjectWill(actor,true); " first have to close ", (the) x1, ".";
1091         4:  CSubjectDont(x1,true); " seem to fit the lock.";
1092         5:  CSubjectVerb(actor,false,false,"lock",0,"locks","locked"); " ", (the) x1, ".";
1093     }
1094   Look: switch (n) {
1095         1:  print " (on ", (the) x1, ")";
1096         2:  print " (in ", (the) x1, ")";
1097         3:  print " (as ", (object) x1, ")";
1098         4:  print "^On ", (the) x1;
1099             WriteListFrom(child(x1),
1100               ENGLISH_BIT+RECURSE_BIT+PARTINV_BIT+TERSE_BIT+CONCEAL_BIT+ISARE_BIT);
1101             ".";
1102         5,6:
1103             if (x1 ~= location) {
1104                 if (x1 has supporter) print "^On "; else print "^In ";
1105                 print (the) x1, " ", (theActor) actor, " ";
1106                 Tense("can", "could");
1107             }
1108             else { new_line; CSubjectCan(actor,false); }
1109             if (n == 5) print " also";
1110             print " see ";
1111             WriteListFrom(child(x1),
1112               ENGLISH_BIT+RECURSE_BIT+PARTINV_BIT+TERSE_BIT+CONCEAL_BIT+WORKFLAG_BIT);
1113             if (x1 ~= location) "."; else " here.";
1114         7:  CSubjectVerb(actor,true,false,"see",0,"sees", "saw"); " nothing unexpected in that direction.";
1115     }
1116   LookUnder: switch (n) {
1117         1:  print "But it";
1118             Tense("'s", " was");
1119             " dark.";
1120         2:  CSubjectVerb(actor,true,false,"find",0,"finds", "found"); " nothing of interest.";
1121     }
1122   Mild:     "Quite.";
1123   Miscellany: switch (n) {
1124         1:  "(considering the first sixteen objects only)^";
1125         2:  "Nothing to do.";
1126         3:  print " "; CSubjectVerb(player, false, false, "died", "have died", "has died");
1127             print " ";
1128         4:  print " "; CSubjectVerb(player, false, false, "won", "have won", "has won");
1129             print " ";
1130         5:  print "^Would you like to RESTART, RESTORE a saved game";
1131             #Ifdef DEATH_MENTION_UNDO;
1132             if (undo_flag ~= 0)
1133                 print ", UNDO your last move";
1134             #Endif;
1135             if (TASKS_PROVIDED == 0) print ", give the FULL score for that game";
1136             if (deadflag == 2 && AMUSING_PROVIDED == 0)
1137                 print ", see some suggestions for AMUSING things to do";
1138             SerialComma(3); print " or QUIT?";
1139         6:  "[Your interpreter does not provide ~undo~.  Sorry!]";
1140             #Ifdef TARGET_ZCODE;
1141         7:  "~Undo~ failed.  [Not all interpreters provide it.]";
1142             #Ifnot; ! TARGET_GLULX
1143         7:  "[You cannot ~undo~ any further.]";
1144             #Endif; ! TARGET_
1145         8:  "Please give one of the answers above.";
1146         9:  print "^It ";
1147             Tense("is now", "was");
1148             print " pitch dark in ";
1149             Tense("here", "there");
1150             ".";
1151         10: "I beg your pardon?";
1152         11: "[You can't ~undo~ what hasn't been done!]";
1153         12: "[Can't ~undo~ twice in succession. Sorry!]";
1154         13: "[Previous turn undone.]";
1155         14: "Sorry, that can't be corrected.";
1156         15: "Think nothing of it.";
1157         16: "~Oops~ can only correct a single word.";
1158         17: print "It ";
1159             Tense("is", "was");
1160             print " pitch dark, and ", (theActor) actor;
1161             Tense(" can't", " couldn't");
1162             " see a thing.";
1163         18: print "yourself";
1164         19: "As good-looking as ever.";
1165         20: "To repeat a command like ~frog, jump~, just say ~again~, not ~frog, again~.";
1166         21: CSubjectCan(actor,true); " hardly repeat that.";
1167         22: CSubjectCant(actor, true); " begin with a comma.";
1168         23: CSubjectVerb(actor, true, false, "seem", "seem", "seems", "seemed");
1169             print " to want to talk to someone, but I ";
1170             Tense("can't", "couldn't"); " see whom.";
1171         24: CSubjectCant(actor, true); " talk to ", (the) x1, ".";
1172         25: "To talk to someone, try ~someone, hello~ or some such.";
1173         26: "(first taking ", (the) x1, ")";
1174         27: "I didn't understand that sentence.";
1175         28: print "I only understood you as far as wanting to ";
1176         29: "I didn't understand that number.";
1177         30: CSubjectCant(actor,true); " see any such thing.";
1178         31: CSubjectVerb(actor, true, false, "seem", "seem", "seems", "seemed");
1179             " to have said too little.";
1180         32: CSubjectIsnt(actor); " holding that.";
1181         33: "You can't use multiple objects with that verb.";
1182         34: "You can only use multiple objects once on a line.";
1183         35: "I'm not sure what ~", (address) x1, "~ refers to.";
1184         36: "You excepted something not included anyway.";
1185         37: CSubjectCan(actor,true); " only do that to something animate.";
1186             #Ifdef DIALECT_US;
1187         38: "That's not a verb I recognize.";
1188             #Ifnot;
1189         38: "That's not a verb I recognise.";
1190             #Endif;
1191         39: "That's not something you need to refer to in the course of this game.";
1192         40: CSubjectCant(actor,true); " see ~", (address) x1, "~ (", (the) x2, ") at the moment.";
1193         41: "I didn't understand the way that finished.";
1194         42: if (x1 == 0) print "None"; else print "Only ", (number) x1;
1195             print " of those ";
1196             if (x1 == 1) print "is"; else print "are";
1197             " available.";
1198         43: "Nothing to do.";
1199         44: print "There ";
1200             Tense("is", "was");
1201             " nothing to ", (address) x1, ".";
1202         45: print "Who do you mean, ";
1203         46: print "Which do you mean, ";
1204         47: "Sorry, you can only have one item here. Which exactly?";
1205         48: print "Whom ";
1206             CSubjectVoice(player, "do", "do", "does", "did");
1207             print " ";
1208             CSubjectVerb(player, false, true, "want", "want", "want", "want");
1209             if (x1 ~= player && x1 ~= nothing) print " ", (the) x1;
1210             print " to "; PrintCommand(); "?";
1211         49: print "What ";
1212             CSubjectVoice(player, "do", "do", "does", "did");
1213             print " ";
1214             CSubjectVerb(player, false, true, "want", "want", "want", "want");
1215             if (x1 ~= player && x1 ~= nothing) print " ", (the) x1;
1216             print " to "; PrintCommand(); "?";
1217         50: print "The score has just gone ";
1218             if (x1 > 0) print "up"; else { x1 = -x1; print "down"; }
1219             print " by ", (number) x1, " point";
1220             if (x1 > 1) print "s";
1221         51: "(Since something dramatic has happened, your list of commands has been cut short.)";
1222         52: "^Type a number from 1 to ", x1, ", 0 to redisplay or press ENTER.";
1223         53: "^[Please press SPACE.]";
1224         54: "[Comment recorded.]";
1225         55: "[Comment NOT recorded.]";
1226         56: ".";
1227         57: "?";
1228         58: "(first taking ", (the) x1, " ", (nop) SupportObj(x2,"off","out of"), " ", (the) x2, ")";
1229         59: "You'll have to be more specific.";
1230         60: print (The) x1, " observes that ";
1231     }
1232   No,Yes:   "That was a rhetorical question.";
1233   NotifyOff:
1234             "Score notification off.";
1235   NotifyOn: "Score notification on.";
1236   Objects: switch (n) {
1237         1:  print (nop) CSubjectVerb(actor, false, false, "have", "have", "has"), " handled";
1238         2:  CSubjectVerb(actor, false, false, "have", "have", "has"); " handled nothing.";
1239         3:  print " (worn)";
1240         4:  print " (held)";
1241         5:  print " (given away)";
1242         6:  print " (in ", (name) x1, ")";
1243         7:  print " (in ", (the) x1, ")";
1244         8:  print " (inside ", (the) x1, ")";
1245         9:  print " (on ", (the) x1, ")";
1246         10: print " (lost)";
1247     }
1248   Open: switch (n) {
1249         1:  CSubjectIs  (x1,true);
1250             print " not something ", (theActor) actor;
1251             Tense(" can open", " could have opened");
1252             ".";
1253         2:  CSubjectVerb(x1,true,false,"seem",0,"seems","seemed"); " to be locked.";
1254         3:  CSubjectIs  (x1,true); " already open.";
1255         4:  CSubjectVerb(actor,false,false,"open",0,"opens","opened"); print " ", (the) x1;
1256             Tense(", revealing ", " and revealed ");
1257                 if (WriteListFrom(child(x1), ENGLISH_BIT+TERSE_BIT+CONCEAL_BIT) == 0) "nothing.";
1258                 ".";
1259         5:  CSubjectVerb(actor,false,false,"open",0,"opens","opened"); " ", (the) x1, ".";
1260         6:  "(first opening ", (the) x1, ")";
1261     }
1262   Order:    CSubjectHas(x1,false); " better things to do.";
1263   Places: switch (n) {
1264         1:  print (nop) CSubjectVerb(actor, false, false, "have", "have", "has"), " visited";
1265         2:  ".";
1266         3:  CSubjectVerb(actor, false, false, "have", "have", "has"); " visited nothing.";
1267     }
1268   Pray:     print "Nothing practical ";
1269             Tense("results", "resulted");
1270             " from ", (Possessive) actor, " prayer.";
1271   Prompt:   print "^>";
1272   Pronouns: switch (n) {
1273         1:  print "At the moment, ";
1274         2:  print "means ";
1275         3:  print "is unset";
1276         4:  "no pronouns are known to the game.";
1277         5:  ".";
1278     }
1279   Pull,Push,Turn: switch (n) {
1280         1:  if (player provides narrative_voice && player.narrative_voice == 3) {
1281                 print_ret (The) player, " ", (nop) Tense("isn't", "wasn't"),
1282                   " likely to help matters by punishing ",
1283                               (OnesSelf) player, " that way.";
1284             } else {
1285                 "Punishing ", (OnesSelf) player, " that way ",
1286                               (nop) Tense("isn't", "wasn't"), " likely to help matters.";
1287             }
1288         2:  CSubjectIs  (x1,true); " fixed in place.";
1289         3:  CSubjectIs  (actor,true); " unable to.";
1290         4:  print "Nothing obvious ";
1291             Tense("happens", "happened");
1292             ".";
1293         5:  print "That would ";
1294             Tense("be", "have been");
1295             " less than courteous.";
1296         6:  DecideAgainst();
1297     }
1298 ! Push: see Pull
1299   PushDir: switch (n) {
1300         1:  print "That really wouldn't ";
1301             Tense("serve", "have served");
1302             " any purpose.";
1303         2:  print "That's ";
1304             Tense("not", "wasn't");
1305             " a direction.";
1306         3:  print "Not that way ", (theActor) actor;
1307             Tense(" can't", "couldn't");
1308             ".";
1309     }
1310   PutOn: switch (n) {
1311         1:  CSubjectVerb(actor,true,false,"need",0,"needs","needed");
1312             print " to be holding ", (the) x1, " before ", (theActor) actor;
1313             Tense(" can", " could");
1314             " put ", (ItOrThem) x1, " on top of something else.";
1315         2:  CSubjectCant(actor,true,true); " put something on top of itself.";
1316         3:  print "Putting things on ", (the) x1, " would";
1317             Tense(" achieve", "'ve achieved");
1318             " nothing.";
1319         4:  CSubjectVerb(actor,true,false,"lack",0,"lacks","lacked"); " the dexterity.";
1320         5:  "(first taking ", (ItOrThem) x1, " off)";
1321         6:  print "There ";
1322             Tense("is", "was");
1323             " no more room on ", (the) x1, ".";
1324         7:  "Done.";
1325         8:  CSubjectVerb(actor,false,false,"put",0,"puts","put"); " ", (the) x1, " on ", (the) x2, ".";
1326     }
1327   Quit: switch (n) {
1328         1:  print "Please answer yes or no.";
1329         2:  print "Are you sure you want to quit? ";
1330     }
1331   Remove: switch (n) {
1332         1:  CSubjectIs  (x1,true); " unfortunately closed.";
1333         2:  print "But ";
1334             CSubjectIsnt(x1,true,true); " there now.";
1335         3:  "Removed.";
1336         4:  print "But ";
1337             CSubjectIsnt(x1,true,true); " in or on anything.";
1338     }
1339   Restart: switch (n) {
1340         1:  print "Are you sure you want to restart? ";
1341         2:  "Failed.";
1342     }
1343   Restore: switch (n) {
1344         1:  "Restore failed.";
1345         2:  "Ok.";
1346     }
1347   Rub: switch (n) {
1348         1:  CSubjectVerb(actor,true,false,"achieve",0,"achieves","achieved");
1349             " nothing by this.";
1350         2:  DecideAgainst();
1351     }
1352   RunTimeError: print "** ";
1353         switch (n) {
1354         1:  print "Preposition not found (this should not occur)";
1355         2:  print "Property value not routine or string: ~", (property) x2,
1356                 "~ of ~", (name) x1, "~ (", x1, ")";
1357         3:  print "Entry in property list not routine or string: ~",
1358                 (property) x2, "~ list of ~", (name) x1, "~ (", x1, ")";
1359         4:  print "Too many timers/daemons are active simultaneously.
1360                 The limit is the library constant MAX_TIMERS
1361                 (currently ", MAX_TIMERS, ") and should be increased";
1362         5:  print "Object ~", (name) x1, "~ has no ~", (property) x2,
1363                 "~ property";
1364         7:  print "The object ~", (name) x1, "~ can only be used as a player
1365                 object if it has the ~number~ property";
1366         8:  print "Attempt to take random entry from an empty table array";
1367         9:  print x1, " is not a valid direction property number";
1368         10: print "The player-object is outside the object tree";
1369         11: print "The room ~", (name) x1, "~ has no ~", (property) x2,
1370                 "~ property";
1371         12: print "Tried to set a non-existent pronoun using SetPronoun";
1372         13: print "A 'topic' token can only be followed by a preposition";
1373         14: print "Overflowed buffer limit of ", x1,
1374                 " using '@@64output_stream 3' ", (string) x2;
1375         15: print "LoopWithinObject broken because the object ",
1376                 (name) x1, " was moved while the loop passed through it.";
1377         16: print "Attempt to use illegal narrative_voice of ", x1, ".";
1378         default:
1379             print "(unexplained)";
1380     }
1381     print " **";
1382   Save: switch (n) {
1383         1:  "Save failed.";
1384         2:  "Ok.";
1385     }
1386   Score: switch (n) {
1387         1:  if (deadflag) print "In that game you scored "; else print "You have so far scored ";
1388                 print score, " out of a possible ", MAX_SCORE, ", in ", turns, " turn";
1389                 if (turns ~= 1) print "s";
1390                 return;
1391         2:  "There is no score in this story.";
1392     }
1393   ScriptOff: switch (n) {
1394         1:  "Transcripting is already off.";
1395         2:  "^End of transcript.";
1396         3:  "Attempt to end transcript failed.";
1397     }
1398   ScriptOn: switch (n) {
1399         1:  "Transcripting is already on.";
1400         2:  print "Start of a transcript of"; VersionSub();
1401         3:  "Attempt to begin transcript failed.";
1402     }
1403   Search: switch (n) {
1404         1:  print "But it";
1405             Tense("'s", " was");
1406             " dark.";
1407         2:  print "There ";
1408             Tense("is", "was");
1409             " nothing on ", (the) x1, ".";
1410         3:  print "On ", (the) x1;
1411                 WriteListFrom(child(x1), ENGLISH_BIT+TERSE_BIT+CONCEAL_BIT+ISARE_BIT);
1412                 ".";
1413         4:  CSubjectVerb(actor,true,false,"find",0,"finds","found"); " nothing of interest.";
1414         5:  CSubjectCant(actor,true); " see inside, since ", (the) x1, " ", (IsOrAre) x1, " closed.";
1415         6:  "", (The) x1, " ", (IsOrAre) x1, " empty.";
1416
1417         7:  print "In ", (the) x1;
1418                 WriteListFrom(child(x1), ENGLISH_BIT+TERSE_BIT+CONCEAL_BIT+ISARE_BIT);
1419                 ".";
1420     }
1421    ! Preceding "No," unable to be used for Set and SetTo
1422   Set:      CSubjectCant(actor,true); " set ", (ThatOrThose) x1, ".";
1423   SetTo:    CSubjectCant(actor,true); " set ", (ThatOrThose) x1, " to anything.";
1424   Show: switch (n) {
1425         1:  CSubjectIsnt(actor,true); " holding ", (the) x1, ".";
1426         2:  CSubjectIs  (x1,true); " unimpressed.";
1427     }
1428   Sing:     print (PossessiveCaps) actor, " singing ";
1429             Tense("is", "was");
1430             " abominable.";
1431   Sleep:    CSubjectIsnt(actor,true); " feeling especially drowsy.";
1432   Smell: switch (n) {
1433         1:  CSubjectVerb(actor,true,false,"smell",0,"smells","smelled"); " nothing unexpected.";
1434         2:  DecideAgainst();
1435     }
1436             #Ifdef DIALECT_US;
1437   Sorry:    "Oh, don't apologize.";
1438             #Ifnot;
1439   Sorry:    "Oh, don't apologise.";
1440             #Endif;
1441   Squeeze: switch (n) {
1442         1:  DecideAgainst();
1443         2:  CSubjectVerb(actor,true,false,"achieve",0,"achieves","achieved"); " nothing by this.";
1444     }
1445   Strong:   print "Real adventurers ";
1446             Tense ("do", "did");
1447             " not use such language.";
1448   Swim:     print "There";
1449             Tense("'s not", " wasn't");
1450             " enough water to swim in.";
1451   Swing:    print "There";
1452             Tense("'s", " was");
1453             " nothing sensible to swing here.";
1454   SwitchOff: switch (n) {
1455         1:  CSubjectIs  (x1,true);
1456             print " not something ", (theActor) actor, " ";
1457             Tense("can", "could");
1458             " switch.";
1459         2:  CSubjectIs  (x1,true); " already off.";
1460         3:  CSubjectVerb(actor,false,false,"switch",0,"switches","switched"); " ", (the) x1, " off.";
1461     }
1462   SwitchOn: switch (n) {
1463         1:  CSubjectIs  (x1,true);
1464             print " not something ", (theActor) actor, " ";
1465             Tense("can", "could");
1466             " switch.";
1467         2:  CSubjectIs  (x1,true); " already on.";
1468         3:  CSubjectVerb(actor,false,false,"switch",0,"switches","switched"); " ", (the) x1, " on.";
1469     }
1470
1471   Take: switch (n) {
1472         1:  "Taken.";
1473         2:  CSubjectIs  (actor,false); " always self-possessed.";
1474         3:  print "I don't suppose ", (the) x1, " would ";
1475             Tense("care", "have cared");
1476             " for that.";
1477         4:  CSubjectWill(actor,true);
1478             print " have ";
1479             Tense("", "had ");
1480             "to get ", (nop) SupportObj(x1,"off","out of"), " ", (the) x1, " first.";
1481         5:  CSubjectVerb(actor,true,false,"already have",0,"already has","already had"); " ", (ThatOrThose) x1, ".";
1482         6:  CSubjectVerb(x2,true,false,"seem",0,"seems","seemed"); " to belong to ", (the) x1, ".";
1483         7:  CSubjectVerb(x2,true,false,"seem",0,"seems","seemed"); " to be a part of ", (the) x1, ".";
1484         8:  CSubjectIs  (x1,true); " not available.";
1485         9:  CSubjectIs  (x1,true); " not open.";
1486         10: CSubjectIs  (x1,true); " hardly portable.";
1487         11: CSubjectIs  (x1,true); " fixed in place.";
1488         12: CSubjectIs  (actor,true); " carrying too many things already.";
1489         13: "(putting ", (the) x1, " into ", (the) x2, " to make room)";
1490     }
1491   Taste: switch (n) {
1492         1:  CSubjectVerb(actor,true,false,"taste",0,"tastes","tasted"); " nothing unexpected.";
1493         2:  DecideAgainst();
1494     }
1495   Tell: switch (n) {
1496         1:  CSubjectVerb(actor,false,false,"talk",0,"talks","talked");
1497             " to ", (OnesSelf) actor, " for a while.";
1498         2:  print "This provoke";
1499             Tense("s", "d");
1500             " no reaction.";
1501     }
1502   Think:    "What a good idea.";
1503   ThrowAt: switch (n) {
1504         1:  "Futile.";
1505         2:  CSubjectVerb(actor,true,false,"lack",0,"lacks","lacked");
1506             print " the nerve when it ";
1507             Tense("comes", "came");
1508             " to the crucial moment.";
1509     }
1510   Tie: switch (n) {
1511         1:  CSubjectVerb(actor,true,false,"would",0,0);
1512             Tense(" achieve", " have achieved");
1513             " nothing by this.";
1514         2:  DecideAgainst();
1515     }
1516   Touch: switch (n) {
1517         1:  DecideAgainst();
1518         2:  CSubjectVerb(actor,true,false,"feel",0,"feels","felt"); " nothing unexpected.";
1519         3:  print "That really wouldn't ";
1520             Tense("serve", "have served");
1521             " any purpose.";
1522     }
1523 ! Turn: see Pull.
1524   Unlock:  switch (n) {
1525         1:  CSubjectDont(x1,true);
1526             print " seem to be something ", (theActor) actor;
1527             Tense(" can unlock", " could have unlocked");
1528             ".";
1529         2:  CSubjectIs  (x1,true); " unlocked at the moment.";
1530         3:  CSubjectDont(x1,true); " seem to fit the lock.";
1531         4:  CSubjectVerb(actor,false,false,"unlock",0,"unlocks","unlocked"); " ", (the) x1, ".";
1532         5:  "(first unlocking ", (the) x1, ")";
1533     }
1534   VagueGo:  CSubjectWill(actor);
1535             print " have ";
1536             Tense("", "had ");
1537             "to say which compass direction to go in.";
1538   Verify: switch (n) {
1539         1:  "The game file has verified as intact.";
1540         2:  "The game file did not verify as intact, and may be corrupt.";
1541     }
1542   Wait:     print "Time passe";
1543             Tense("s", "d");
1544             ".";
1545   Wake:     print "The dreadful truth is, this ";
1546             Tense("is", "was");
1547             " not a dream.";
1548   WakeOther:print "That seem";
1549             Tense("s", "ed");
1550             " unnecessary.";
1551   Wave: switch (n) {
1552         1:  print "But ";
1553             CSubjectIsnt(actor,true,true); " holding ", (ThatOrThose) x1, ".";
1554         2:  CSubjectVerb(actor,false,false,"look",0,"looks","looked");
1555             print " ridiculous waving ", (the) x1;
1556             if (x2)
1557                 " at ", (the) x2, ".";
1558             ".";
1559         3:  DecideAgainst();
1560     }
1561   WaveHands:
1562         CSubjectVerb(actor,false,false,"wave",0,"waves","waved");
1563         switch (n) {
1564         1: ! nothing
1565         2: print " at ", (the) x1;
1566         }
1567         ", feeling foolish.";
1568   Wear: switch (n) {
1569         1:  CSubjectCant(actor,true); " wear ", (ThatOrThose) x1, ".";
1570         2:  CSubjectIs  (actor,true); " not holding ", (ThatOrThose) x1, ".";
1571         3:  CSubjectIs  (actor,true); " already wearing ", (ThatOrThose) x1, ".";
1572         4:  CSubjectVerb(actor,false,false,"put on",0,"puts on","put on"); " ", (the) x1, ".";
1573         5:  CSubjectVerb(actor, false, false, "need to take", 0, 0, "had to take");
1574             print " ", (the) x1, " ";
1575             if (x2 has container)
1576                 print "out";
1577             else
1578                 print "off";
1579             " of ", (the) x2, " before wearing ", (ItOrThem) x1, ".";
1580     }
1581 ! Yes:  see No.
1582 ];
1583
1584 ! ==============================================================================
1585
1586 Constant LIBRARY_ENGLISH;       ! for dependency checking.
1587 #Endif;
1588
1589 ! ==============================================================================