Import v6.12.4 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.4 -- Serial number 200718
5 !
6 !   Copyright Graham Nelson 1993-2004 and David Griffith 2012-2020
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 '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     }
897   Eat: switch (n) {
898         1:  CSubjectIs(x1,true); " plainly inedible.";
899         2:  CSubjectVerb(actor,false,false,"eat",0,"eats", "ate"); print " ", (the) x1;
900                 if (actor == player) ". Not bad."; else ".";
901     }
902   EmptyT: switch (n) {
903         1:  CSubjectCant(x1,true); " contain things.";
904         2:  CSubjectIs(x1,true); " closed.";
905         3:  CSubjectIs(x1,true); " empty already.";
906         4:  print "That wouldn't ";
907             Tense("empty", "have emptied");
908             " anything.";
909     }
910   Enter: switch (n) {
911         1:  print "But "; CSubjectIs(actor,true,true);
912             " already ", (nop) SupportObj(x1,"on ","in "), (the) x1, ".";
913         2:  CSubjectIs(x1,true);
914             print " not something ", (theActor) actor;
915             Tense(" can ", " could ");
916             switch (x2) {
917               'stand':  "stand on.";
918               'sit':    "sit down on.";
919               'lie':    "lie down on.";
920               default:  "enter.";
921             }
922         3:  CSubjectCant(actor,true);
923             " get into the closed ", (name) x1, ".";
924         4:  CSubjectCan(actor,true);
925             " only get into something free-standing.";
926         5:  CSubjectVerb(actor,false,false,"get",0,"gets","got");
927             SupportObj(x1," onto"," into"); " ", (the) x1, ".";
928         6:  "(getting ", (nop) SupportObj(x1,"off","out of"), " ", (the) x1, ")";
929         7:  if (x1 has supporter) "(getting onto ", (the) x1, ")";
930             if (x1 has container) "(getting into ", (the) x1, ")";
931                                   "(entering ", (the) x1, ")";
932     }
933   Examine: switch (n) {
934         1:  "Darkness, noun.  An absence of light to see by.";
935         2:  CSubjectVerb(actor,true,false,"see",0,"sees","saw");
936             " nothing special about ", (the) x1, ".";
937         3:  CSubjectIs(x1,true);
938             Tense(" currently");
939             print " switched ";
940             if (x1 has on) "on."; else "off.";
941     }
942   Exit: switch (n) {
943         1:  print "But ";
944             CSubjectIsnt(actor,true,true);
945             " in anything at the moment.";
946         2:  CSubjectCant(actor,false);
947             " get out of the closed ", (name) x1, ".";
948         3:  CSubjectVerb(actor,false,false,"get",0,"gets", "got");
949             print " ";
950             SupportObj(x1,"off","out of"); " ", (the) x1, ".";
951         4:  CSubjectIsnt(actor,true);
952             print " ";
953             SupportObj(x1,"on","in"); " ", (the) x1, ".";
954         5:  "(first getting ", (nop) SupportObj(x1,"off","out of"),
955               " ", (the) x1, ")";
956         6:  CSubjectVerb(actor,false,false,"stand",0,"stands","stood"); " up.";
957     }
958   Fill: switch (n) {
959         1:  print "There ";
960             Tense("isn't", "wasn't");
961             " anything obvious with which to fill ", (the) x1, ".";
962         2:  print "Filling ", (the) x1, " from ", (the) x2, " wouldn't ";
963             Tense("make", "have made");
964             " sense.";
965     }
966   FullScore: switch (n) {
967         1:  if (deadflag) print "The score was "; else print "The score is ";
968                 "made up as follows:^";
969         2:  "finding sundry items";
970         3:  "visiting various places";
971         4:  print "total (out of ", MAX_SCORE; ")";
972     }
973   GetOff:   print "But ";
974             CSubjectIsnt(actor,true,true); " on ", (the) x1, " at the moment.";
975   Give: switch (n) {
976         1:  CSubjectIsnt(actor,true); " holding ", (the) x1, ".";
977         2:  CSubjectVerb(actor,false,false,"juggle",0,"juggles","juggled");
978             print " ", (the) x1, " for a while, but ";
979             CSubjectVoice(actor,"don't","don't","doesn't","didn't");
980             " achieve much.";
981         3:  CSubjectDont(x1,true); " seem interested.";
982         4:  CSubjectVerb(actor,false,false,"hand over",0,"hands over","handed over");
983             " ", (the) x1, ".";
984     }
985   Go: switch (n) {
986         1:  CSubjectWill(actor,true);
987             Tense(" have", " have had");
988                 " to get ", (nop) SupportObj(x1,"off","out of"), " ", (the) x1, " first.";
989         2:  CSubjectCant(actor,true); " go that way.";
990         3:  CSubjectIs  (actor,true); " unable to climb ", (the) x1, ".";
991         4:  CSubjectIs  (actor,true); " unable to descend by ", (the) x1, ".";
992         5:  CSubjectCant(actor,true); " since ", (the) x1, " ", (IsOrAre) x1, " in the way.";
993         6:  CSubjectCant(actor,true); " since ", (the) x1, " ", (nop) PluralObj(x1,"lead","leads","led"), " nowhere.";
994         7:  CSubjectVerb(actor,false,false,"depart",0,"departs","departed"); ".";
995     }
996   Insert: switch (n) {
997         1:  CSubjectVerb(actor,true,false,"need",0,"needs","needed");
998             print " to be holding ", (the) x1, " before ", (theActor) actor;
999             Tense(" can", " could");
1000             " put ", (ItOrThem) x1, " into something else.";
1001         2:  CSubjectCant(x1,true); " contain things.";
1002         3:  CSubjectIs  (x1,true); " closed.";
1003         4:  CSubjectWill(actor,true);
1004             Tense(" need", " have needed");
1005             " to take ", (ItOrThem) x1, " off first.";
1006         5:  CSubjectCant(actor,true); " put something inside itself.";
1007         6:  "(first taking ", (ItOrThem) x1, " off)";
1008         7:  print "There";
1009             Tense(" is", " was");
1010             " no more room in ", (the) x1, ".";
1011         8:  "Done.";
1012         9:  CSubjectVerb(actor,false,false,"put",0,"puts","put"); " ", (the) x1, " into ", (the) x2, ".";
1013     }
1014   Inv: switch (n) {
1015         1:  CSubjectIs  (actor,false); " carrying nothing.";
1016         2:  CSubjectIs  (actor,false); print " carrying";
1017         3:  ":";
1018         4:  ".";
1019     }
1020   Jump: CSubjectVerb(actor,false,false,"jump",0,"jumps","jumped"); " on the spot, fruitlessly.";
1021   JumpIn: switch (n) {
1022         1: print "Jumping in ", (the) x1, " ";
1023            Tense("would achieve", "would have achieved");
1024            " nothing here.";
1025         2: DecideAgainst();
1026     }
1027   JumpOn: switch (n) {
1028         1: print "Jumping upon ", (the) x1, " ";
1029            Tense("would achieve", "would have achieved");
1030            " nothing here.";
1031         2: DecideAgainst();
1032     }
1033   JumpOver: switch (n) {
1034         1: print "Jumping over ", (the) x1, " ";
1035            Tense("would achieve", "would have achieved");
1036            " nothing here.";
1037         2:  DecideAgainst();
1038     }
1039   Kiss:     "Keep your mind on the game.";
1040   Listen:   CSubjectVerb(actor,true,false,"hear",0,"hears","heard"); " nothing unexpected.";
1041   ListMiscellany: switch (n) {
1042         1:  print " (providing light)";
1043         2:  print " (which ", (IsOrAre) x1, " closed)";
1044         3:  print " (closed and providing light)";
1045         4:  print " (which ", (IsOrAre) x1, " empty)";
1046         5:  print " (empty and providing light)";
1047         6:  print " (which ", (IsOrAre) x1, " closed and empty)";
1048         7:  print " (closed, empty and providing light)";
1049         8:  print " (providing light and being worn";
1050         9:  print " (providing light";
1051         10: print " (being worn";
1052         11: print " (which ", (IsOrAre) x1, " ";
1053         12: print "open";
1054         13: print "open but empty";
1055         14: print "closed";
1056         15: print "closed and locked";
1057         16: print " and empty";
1058         17: print " (which ", (IsOrAre) x1, " empty)";
1059         18: print " containing ";
1060         19: print " (on ";
1061         20: print ", on top of ";
1062         21: print " (in ";
1063         22: print ", inside ";
1064     }
1065   LMode1:   print (string) Story, " is now in its ";
1066             if (initial_lookmode == 1) print "normal ";
1067             "~brief~ printing mode, which gives long descriptions
1068              of places never before visited and short descriptions otherwise.";
1069   LMode2:   print (string) Story, " is now in its ";
1070             if (initial_lookmode ~= 1 or 3) print "normal ";
1071             "~verbose~ mode, which always gives long descriptions
1072              of locations (even if you've been there before).";
1073   LMode3:   print (string) Story, " is now in its ";
1074             if (initial_lookmode == 3) print "normal ";
1075             "~superbrief~ mode, which always gives short descriptions
1076              of locations (even if you haven't been there before).";
1077   Lock: switch (n) {
1078         1:  CSubjectDont(x1,true);
1079             print " seem to be something ", (theActor) actor;
1080             Tense(" can", " could");
1081             " lock.";
1082         2:  CSubjectIs  (x1,true); " locked at the moment.";
1083         3:  CSubjectWill(actor,true); " first have to close ", (the) x1, ".";
1084         4:  CSubjectDont(x1,true); " seem to fit the lock.";
1085         5:  CSubjectVerb(actor,false,false,"lock",0,"locks","locked"); " ", (the) x1, ".";
1086     }
1087   Look: switch (n) {
1088         1:  print " (on ", (the) x1, ")";
1089         2:  print " (in ", (the) x1, ")";
1090         3:  print " (as ", (object) x1, ")";
1091         4:  print "^On ", (the) x1;
1092             WriteListFrom(child(x1),
1093               ENGLISH_BIT+RECURSE_BIT+PARTINV_BIT+TERSE_BIT+CONCEAL_BIT+ISARE_BIT);
1094             ".";
1095         5,6:
1096             if (x1 ~= location) {
1097                 if (x1 has supporter) print "^On "; else print "^In ";
1098                 print (the) x1, " ", (theActor) actor, " ";
1099                 Tense("can", "could");
1100             }
1101             else { new_line; CSubjectCan(actor,false); }
1102             if (n == 5) print " also";
1103             print " see ";
1104             WriteListFrom(child(x1),
1105               ENGLISH_BIT+RECURSE_BIT+PARTINV_BIT+TERSE_BIT+CONCEAL_BIT+WORKFLAG_BIT);
1106             if (x1 ~= location) "."; else " here.";
1107         7:  CSubjectVerb(actor,true,false,"see",0,"sees", "saw"); " nothing unexpected in that direction.";
1108     }
1109   LookUnder: switch (n) {
1110         1:  print "But it";
1111             Tense("'s", " was");
1112             " dark.";
1113         2:  CSubjectVerb(actor,true,false,"find",0,"finds", "found"); " nothing of interest.";
1114     }
1115   Mild:     "Quite.";
1116   Miscellany: switch (n) {
1117         1:  "(considering the first sixteen objects only)^";
1118         2:  "Nothing to do.";
1119         3:  print " "; CSubjectVerb(player, false, false, "died", "have died", "has died");
1120             print " ";
1121         4:  print " "; CSubjectVerb(player, false, false, "won", "have won", "has won");
1122             print " ";
1123         5:  print "^Would you like to RESTART, RESTORE a saved game";
1124             #Ifdef DEATH_MENTION_UNDO;
1125             print ", UNDO your last move";
1126             #Endif;
1127             if (TASKS_PROVIDED == 0) print ", give the FULL score for that game";
1128             if (deadflag == 2 && AMUSING_PROVIDED == 0)
1129                 print ", see some suggestions for AMUSING things to do";
1130             SerialComma(3); print " or QUIT?";
1131         6:  "[Your interpreter does not provide ~undo~.  Sorry!]";
1132             #Ifdef TARGET_ZCODE;
1133         7:  "~Undo~ failed.  [Not all interpreters provide it.]";
1134             #Ifnot; ! TARGET_GLULX
1135         7:  "[You cannot ~undo~ any further.]";
1136             #Endif; ! TARGET_
1137         8:  "Please give one of the answers above.";
1138         9:  print "^It ";
1139             Tense("is now", "was");
1140             print " pitch dark in ";
1141             Tense("here", "there");
1142             ".";
1143         10: "I beg your pardon?";
1144         11: "[You can't ~undo~ what hasn't been done!]";
1145         12: "[Can't ~undo~ twice in succession. Sorry!]";
1146         13: "[Previous turn undone.]";
1147         14: "Sorry, that can't be corrected.";
1148         15: "Think nothing of it.";
1149         16: "~Oops~ can only correct a single word.";
1150         17: print "It ";
1151             Tense("is", "was");
1152             print " pitch dark, and ", (theActor) actor;
1153             Tense(" can't", " couldn't");
1154             " see a thing.";
1155         18: print "yourself";
1156         19: "As good-looking as ever.";
1157         20: "To repeat a command like ~frog, jump~, just say ~again~, not ~frog, again~.";
1158         21: CSubjectCan(actor,true); " hardly repeat that.";
1159         22: CSubjectCant(actor, true); " begin with a comma.";
1160         23: CSubjectVerb(actor, true, false, "seem", "seem", "seems", "seemed");
1161             print " to want to talk to someone, but I ";
1162             Tense("can't", "couldn't"); " see whom.";
1163         24: CSubjectCant(actor, true); " talk to ", (the) x1, ".";
1164         25: "To talk to someone, try ~someone, hello~ or some such.";
1165         26: "(first taking ", (the) x1, ")";
1166         27: "I didn't understand that sentence.";
1167         28: print "I only understood you as far as wanting to ";
1168         29: "I didn't understand that number.";
1169         30: CSubjectCant(actor,true); " see any such thing.";
1170         31: CSubjectVerb(actor, true, false, "seem", "seem", "seems", "seemed");
1171             " to have said too little.";
1172         32: CSubjectIsnt(actor); " holding that.";
1173         33: "You can't use multiple objects with that verb.";
1174         34: "You can only use multiple objects once on a line.";
1175         35: "I'm not sure what ~", (address) x1, "~ refers to.";
1176         36: "You excepted something not included anyway.";
1177         37: CSubjectCan(actor,true); " only do that to something animate.";
1178             #Ifdef DIALECT_US;
1179         38: "That's not a verb I recognize.";
1180             #Ifnot;
1181         38: "That's not a verb I recognise.";
1182             #Endif;
1183         39: "That's not something you need to refer to in the course of this game.";
1184         40: CSubjectCant(actor,true); " see ~", (address) x1, "~ (", (the) x2, ") at the moment.";
1185         41: "I didn't understand the way that finished.";
1186         42: if (x1 == 0) print "None"; else print "Only ", (number) x1;
1187             print " of those ";
1188             if (x1 == 1) print "is"; else print "are";
1189             " available.";
1190         43: "Nothing to do.";
1191         44: print "There ";
1192             Tense("is", "was");
1193             " nothing to ", (address) x1, ".";
1194         45: print "Who do you mean, ";
1195         46: print "Which do you mean, ";
1196         47: "Sorry, you can only have one item here. Which exactly?";
1197         48: print "Whom ";
1198             CSubjectVoice(player, "do", "do", "does", "did");
1199             print " ";
1200             CSubjectVerb(player, false, true, "want", "want", "want", "want");
1201             if (x1 ~= player && x1 ~= nothing) print " ", (the) x1;
1202             print " to "; PrintCommand(); "?";
1203         49: print "What ";
1204             CSubjectVoice(player, "do", "do", "does", "did");
1205             print " ";
1206             CSubjectVerb(player, false, true, "want", "want", "want", "want");
1207             if (x1 ~= player && x1 ~= nothing) print " ", (the) x1;
1208             print " to "; PrintCommand(); "?";
1209         50: print "The score has just gone ";
1210             if (x1 > 0) print "up"; else { x1 = -x1; print "down"; }
1211             print " by ", (number) x1, " point";
1212             if (x1 > 1) print "s";
1213         51: "(Since something dramatic has happened, your list of commands has been cut short.)";
1214         52: "^Type a number from 1 to ", x1, ", 0 to redisplay or press ENTER.";
1215         53: "^[Please press SPACE.]";
1216         54: "[Comment recorded.]";
1217         55: "[Comment NOT recorded.]";
1218         56: ".";
1219         57: "?";
1220         58: "(first taking ", (the) x1, " ", (nop) SupportObj(x2,"off","out of"), " ", (the) x2, ")";
1221         59: "You'll have to be more specific.";
1222         60: print (The) x1, " observes that ";
1223     }
1224   No,Yes:   "That was a rhetorical question.";
1225   NotifyOff:
1226             "Score notification off.";
1227   NotifyOn: "Score notification on.";
1228   Objects: switch (n) {
1229         1:  print (nop) CSubjectVerb(actor, false, false, "have", "have", "has"), " handled";
1230         2:  CSubjectVerb(actor, false, false, "have", "have", "has"); " handled nothing.";
1231         3:  print " (worn)";
1232         4:  print " (held)";
1233         5:  print " (given away)";
1234         6:  print " (in ", (name) x1, ")";
1235         7:  print " (in ", (the) x1, ")";
1236         8:  print " (inside ", (the) x1, ")";
1237         9:  print " (on ", (the) x1, ")";
1238         10: print " (lost)";
1239     }
1240   Open: switch (n) {
1241         1:  CSubjectIs  (x1,true);
1242             print " not something ", (theActor) actor;
1243             Tense(" can open", " could have opened");
1244             ".";
1245         2:  CSubjectVerb(x1,true,false,"seem",0,"seems","seemed"); " to be locked.";
1246         3:  CSubjectIs  (x1,true); " already open.";
1247         4:  CSubjectVerb(actor,false,false,"open",0,"opens","opened"); print " ", (the) x1;
1248             Tense(", revealing ", " and revealed ");
1249                 if (WriteListFrom(child(x1), ENGLISH_BIT+TERSE_BIT+CONCEAL_BIT) == 0) "nothing.";
1250                 ".";
1251         5:  CSubjectVerb(actor,false,false,"open",0,"opens","opened"); " ", (the) x1, ".";
1252         6:  "(first opening ", (the) x1, ")";
1253     }
1254   Order:    CSubjectHas(x1,false); " better things to do.";
1255   Places: switch (n) {
1256         1:  print (nop) CSubjectVerb(actor, false, false, "have", "have", "has"), " visited";
1257         2:  ".";
1258         3:  CSubjectVerb(actor, false, false, "have", "have", "has"); " visited nothing.";
1259     }
1260   Pray:     print "Nothing practical ";
1261             Tense("results", "resulted");
1262             " from ", (Possessive) actor, " prayer.";
1263   Prompt:   print "^>";
1264   Pronouns: switch (n) {
1265         1:  print "At the moment, ";
1266         2:  print "means ";
1267         3:  print "is unset";
1268         4:  "no pronouns are known to the game.";
1269         5:  ".";
1270     }
1271   Pull,Push,Turn: switch (n) {
1272         1:  if (player provides narrative_voice && player.narrative_voice == 3) {
1273                 print_ret (The) player, " ", (nop) Tense("isn't", "wasn't"),
1274                   " likely to help matters by punishing ",
1275                               (OnesSelf) player, " that way.";
1276             } else {
1277                 "Punishing ", (OnesSelf) player, " that way ",
1278                               (nop) Tense("isn't", "wasn't"), " likely to help matters.";
1279             }
1280         2:  CSubjectIs  (x1,true); " fixed in place.";
1281         3:  CSubjectIs  (actor,true); " unable to.";
1282         4:  print "Nothing obvious ";
1283             Tense("happens", "happened");
1284             ".";
1285         5:  print "That would ";
1286             Tense("be", "have been");
1287             " less than courteous.";
1288         6:  DecideAgainst();
1289     }
1290 ! Push: see Pull
1291   PushDir: switch (n) {
1292         1:  print "That really wouldn't ";
1293             Tense("serve", "have served");
1294             " any purpose.";
1295         2:  print "That's ";
1296             Tense("not", "wasn't");
1297             " a direction.";
1298         3:  print "Not that way ", (theActor) actor;
1299             Tense(" can't", "couldn't");
1300             ".";
1301     }
1302   PutOn: switch (n) {
1303         1:  CSubjectVerb(actor,true,false,"need",0,"needs","needed");
1304             print " to be holding ", (the) x1, " before ", (theActor) actor;
1305             Tense(" can", " could");
1306             " put ", (ItOrThem) x1, " on top of something else.";
1307         2:  CSubjectCant(actor,true,true); " put something on top of itself.";
1308         3:  print "Putting things on ", (the) x1, " would";
1309             Tense(" achieve", "'ve achieved");
1310             " nothing.";
1311         4:  CSubjectVerb(actor,true,false,"lack",0,"lacks","lacked"); " the dexterity.";
1312         5:  "(first taking ", (ItOrThem) x1, " off)";
1313         6:  print "There ";
1314             Tense("is", "was");
1315             " no more room on ", (the) x1, ".";
1316         7:  "Done.";
1317         8:  CSubjectVerb(actor,false,false,"put",0,"puts","put"); " ", (the) x1, " on ", (the) x2, ".";
1318     }
1319   Quit: switch (n) {
1320         1:  print "Please answer yes or no.";
1321         2:  print "Are you sure you want to quit? ";
1322     }
1323   Remove: switch (n) {
1324         1:  CSubjectIs  (x1,true); " unfortunately closed.";
1325         2:  print "But ";
1326             CSubjectIsnt(x1,true,true); " there now.";
1327         3:  "Removed.";
1328     }
1329   Restart: switch (n) {
1330         1:  print "Are you sure you want to restart? ";
1331         2:  "Failed.";
1332     }
1333   Restore: switch (n) {
1334         1:  "Restore failed.";
1335         2:  "Ok.";
1336     }
1337   Rub: switch (n) {
1338         1:  CSubjectVerb(actor,true,false,"achieve",0,"achieves","achieved");
1339             " nothing by this.";
1340         2:  DecideAgainst();
1341     }
1342   RunTimeError: print "** ";
1343         switch (n) {
1344         1:  print "Preposition not found (this should not occur)";
1345         2:  print "Property value not routine or string: ~", (property) x2,
1346                 "~ of ~", (name) x1, "~ (", x1, ")";
1347         3:  print "Entry in property list not routine or string: ~",
1348                 (property) x2, "~ list of ~", (name) x1, "~ (", x1, ")";
1349         4:  print "Too many timers/daemons are active simultaneously.
1350                 The limit is the library constant MAX_TIMERS
1351                 (currently ", MAX_TIMERS, ") and should be increased";
1352         5:  print "Object ~", (name) x1, "~ has no ~", (property) x2,
1353                 "~ property";
1354         7:  print "The object ~", (name) x1, "~ can only be used as a player
1355                 object if it has the ~number~ property";
1356         8:  print "Attempt to take random entry from an empty table array";
1357         9:  print x1, " is not a valid direction property number";
1358         10: print "The player-object is outside the object tree";
1359         11: print "The room ~", (name) x1, "~ has no ~", (property) x2,
1360                 "~ property";
1361         12: print "Tried to set a non-existent pronoun using SetPronoun";
1362         13: print "A 'topic' token can only be followed by a preposition";
1363         14: print "Overflowed buffer limit of ", x1,
1364                 " using '@@64output_stream 3' ", (string) x2;
1365         15: print "LoopWithinObject broken because the object ",
1366                 (name) x1, " was moved while the loop passed through it.";
1367         16: print "Attempt to use illegal narrative_voice of ", x1, ".";
1368         default:
1369             print "(unexplained)";
1370     }
1371     print " **";
1372   Save: switch (n) {
1373         1:  "Save failed.";
1374         2:  "Ok.";
1375     }
1376   Score: switch (n) {
1377         1:  if (deadflag) print "In that game you scored "; else print "You have so far scored ";
1378                 print score, " out of a possible ", MAX_SCORE, ", in ", turns, " turn";
1379                 if (turns ~= 1) print "s";
1380                 return;
1381         2:  "There is no score in this story.";
1382     }
1383   ScriptOff: switch (n) {
1384         1:  "Transcripting is already off.";
1385         2:  "^End of transcript.";
1386         3:  "Attempt to end transcript failed.";
1387     }
1388   ScriptOn: switch (n) {
1389         1:  "Transcripting is already on.";
1390         2:  print "Start of a transcript of"; VersionSub();
1391         3:  "Attempt to begin transcript failed.";
1392     }
1393   Search: switch (n) {
1394         1:  print "But it";
1395             Tense("'s", " was");
1396             " dark.";
1397         2:  print "There ";
1398             Tense("is", "was");
1399             " nothing on ", (the) x1, ".";
1400         3:  print "On ", (the) x1;
1401                 WriteListFrom(child(x1), ENGLISH_BIT+TERSE_BIT+CONCEAL_BIT+ISARE_BIT);
1402                 ".";
1403         4:  CSubjectVerb(actor,true,false,"find",0,"finds","found"); " nothing of interest.";
1404         5:  CSubjectCant(actor,true); " see inside, since ", (the) x1, " ", (IsOrAre) x1, " closed.";
1405         6:  "", (The) x1, " ", (IsOrAre) x1, " empty.";
1406
1407         7:  print "In ", (the) x1;
1408                 WriteListFrom(child(x1), ENGLISH_BIT+TERSE_BIT+CONCEAL_BIT+ISARE_BIT);
1409                 ".";
1410     }
1411    ! Preceding "No," unable to be used for Set and SetTo
1412   Set:      CSubjectCant(actor,true); " set ", (ThatOrThose) x1, ".";
1413   SetTo:    CSubjectCant(actor,true); " set ", (ThatOrThose) x1, " to anything.";
1414   Show: switch (n) {
1415         1:  CSubjectIsnt(actor,true); " holding ", (the) x1, ".";
1416         2:  CSubjectIs  (x1,true); " unimpressed.";
1417     }
1418   Sing:     print (PossessiveCaps) actor, " singing ";
1419             Tense("is", "was");
1420             " abominable.";
1421   Sleep:    CSubjectIsnt(actor,true); " feeling especially drowsy.";
1422   Smell: switch (n) {
1423         1:  CSubjectVerb(actor,true,false,"smell",0,"smells","smelled"); " nothing unexpected.";
1424         2:  DecideAgainst();
1425     }
1426             #Ifdef DIALECT_US;
1427   Sorry:    "Oh, don't apologize.";
1428             #Ifnot;
1429   Sorry:    "Oh, don't apologise.";
1430             #Endif;
1431   Squeeze: switch (n) {
1432         1:  DecideAgainst();
1433         2:  CSubjectVerb(actor,true,false,"achieve",0,"achieves","achieved"); " nothing by this.";
1434     }
1435   Strong:   print "Real adventurers ";
1436             Tense ("do", "did");
1437             " not use such language.";
1438   Swim:     print "There";
1439             Tense("'s not", " wasn't");
1440             " enough water to swim in.";
1441   Swing:    print "There";
1442             Tense("'s", " was");
1443             " nothing sensible to swing here.";
1444   SwitchOff: switch (n) {
1445         1:  CSubjectIs  (x1,true);
1446             print " not something ", (theActor) actor, " ";
1447             Tense("can", "could");
1448             " switch.";
1449         2:  CSubjectIs  (x1,true); " already off.";
1450         3:  CSubjectVerb(actor,false,false,"switch",0,"switches","switched"); " ", (the) x1, " off.";
1451     }
1452   SwitchOn: switch (n) {
1453         1:  CSubjectIs  (x1,true);
1454             print " not something ", (theActor) actor, " ";
1455             Tense("can", "could");
1456             " switch.";
1457         2:  CSubjectIs  (x1,true); " already on.";
1458         3:  CSubjectVerb(actor,false,false,"switch",0,"switches","switched"); " ", (the) x1, " on.";
1459     }
1460
1461   Take: switch (n) {
1462         1:  "Taken.";
1463         2:  CSubjectIs  (actor,false); " always self-possessed.";
1464         3:  print "I don't suppose ", (the) x1, " would ";
1465             Tense("care", "have cared");
1466             " for that.";
1467         4:  CSubjectWill(actor,true);
1468             print " have ";
1469             Tense("", "had ");
1470             "to get ", (nop) SupportObj(x1,"off","out of"), " ", (the) x1, " first.";
1471         5:  CSubjectVerb(actor,true,false,"already have",0,"already has","already had"); " ", (ThatOrThose) x1, ".";
1472         6:  CSubjectVerb(x2,true,false,"seem",0,"seems","seemed"); " to belong to ", (the) x1, ".";
1473         7:  CSubjectVerb(x2,true,false,"seem",0,"seems","seemed"); " to be a part of ", (the) x1, ".";
1474         8:  CSubjectIs  (x1,true); " not available.";
1475         9:  CSubjectIs  (x1,true); " not open.";
1476         10: CSubjectIs  (x1,true); " hardly portable.";
1477         11: CSubjectIs  (x1,true); " fixed in place.";
1478         12: CSubjectIs  (actor,true); " carrying too many things already.";
1479         13: "(putting ", (the) x1, " into ", (the) x2, " to make room)";
1480         14: CSubjectVerb(actor, false, false, "should take", 0, 0, "should have taken");
1481             " ", (the) x1, " first.";
1482     }
1483   Taste: switch (n) {
1484         1:  CSubjectVerb(actor,true,false,"taste",0,"tastes","tasted"); " nothing unexpected.";
1485         2:  DecideAgainst();
1486     }
1487   Tell: switch (n) {
1488         1:  CSubjectVerb(actor,false,false,"talk",0,"talks","talked");
1489             " to ", (OnesSelf) actor, " for a while.";
1490         2:  print "This provoke";
1491             Tense("s", "d");
1492             " no reaction.";
1493     }
1494   Think:    "What a good idea.";
1495   ThrowAt: switch (n) {
1496         1:  "Futile.";
1497         2:  CSubjectVerb(actor,true,false,"lack",0,"lacks","lacked");
1498             print " the nerve when it ";
1499             Tense("comes", "came");
1500             " to the crucial moment.";
1501     }
1502   Tie: switch (n) {
1503         1:  CSubjectVerb(actor,true,false,"would",0,0);
1504             Tense(" achieve", " have achieved");
1505             " nothing by this.";
1506         2:  DecideAgainst();
1507     }
1508   Touch: switch (n) {
1509         1:  DecideAgainst();
1510         2:  CSubjectVerb(actor,true,false,"feel",0,"feels","felt"); " nothing unexpected.";
1511         3:  print "That really wouldn't ";
1512             Tense("serve", "have served");
1513             " any purpose.";
1514     }
1515 ! Turn: see Pull.
1516   Unlock:  switch (n) {
1517         1:  CSubjectDont(x1,true);
1518             print " seem to be something ", (theActor) actor;
1519             Tense(" can unlock", " could have unlocked");
1520             ".";
1521         2:  CSubjectIs  (x1,true); " unlocked at the moment.";
1522         3:  CSubjectDont(x1,true); " seem to fit the lock.";
1523         4:  CSubjectVerb(actor,false,false,"unlock",0,"unlocks","unlocked"); " ", (the) x1, ".";
1524         5:  "(first unlocking ", (the) x1, ")";
1525     }
1526   VagueGo:  CSubjectWill(actor);
1527             print " have ";
1528             Tense("", "had ");
1529             "to say which compass direction to go in.";
1530   Verify: switch (n) {
1531         1:  "The game file has verified as intact.";
1532         2:  "The game file did not verify as intact, and may be corrupt.";
1533     }
1534   Wait:     print "Time passe";
1535             Tense("s", "d");
1536             ".";
1537   Wake:     print "The dreadful truth is, this ";
1538             Tense("is", "was");
1539             " not a dream.";
1540   WakeOther:print "That seem";
1541             Tense("s", "ed");
1542             " unnecessary.";
1543   Wave: switch (n) {
1544         1:  print "But ";
1545             CSubjectIsnt(actor,true,true); " holding ", (ThatOrThose) x1, ".";
1546         2:  CSubjectVerb(actor,false,false,"look",0,"looks","looked");
1547             print " ridiculous waving ", (the) x1;
1548             if (x2)
1549                 " at ", (the) x2, ".";
1550             ".";
1551         3:  DecideAgainst();
1552     }
1553   WaveHands:
1554         CSubjectVerb(actor,false,false,"wave",0,"waves","waved");
1555         switch (n) {
1556         1: ! nothing
1557         2: print " at ", (the) x1;
1558         }
1559         ", feeling foolish.";
1560   Wear: switch (n) {
1561         1:  CSubjectCant(actor,true); " wear ", (ThatOrThose) x1, ".";
1562         2:  CSubjectIs  (actor,true); " not holding ", (ThatOrThose) x1, ".";
1563         3:  CSubjectIs  (actor,true); " already wearing ", (ThatOrThose) x1, ".";
1564         4:  CSubjectVerb(actor,false,false,"put on",0,"puts on","put on"); " ", (the) x1, ".";
1565     }
1566 ! Yes:  see No.
1567 ];
1568
1569 ! ==============================================================================
1570
1571 Constant LIBRARY_ENGLISH;       ! for dependency checking.
1572 #Endif;
1573
1574 ! ==============================================================================