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