Upgrade make(1). 1/2
[dragonfly.git] / games / battlestar / command5.c
1 /*      @(#)com5.c      8.2 (Berkeley) 4/28/95                          */
2 /*      $NetBSD: command5.c,v 1.5 2014/03/22 23:31:28 dholland Exp $    */
3
4 /*
5  * Copyright (c) 1983, 1993
6  *      The Regents of the University of California.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32
33 #include "extern.h"
34
35 void
36 kiss(void)
37 {
38         while (wordtype[++wordnumber] != NOUNS && wordnumber <= wordcount)
39                 continue;
40         /* The goddess must be "taken" first if bathing. */
41         if (wordtype[wordnumber] == NOUNS && wordvalue[wordnumber] == NORMGOD
42             && testbit(location[position].objects, BATHGOD)) {
43                 wordvalue[--wordnumber] = TAKE;
44                 cypher();
45                 return;
46         }
47         if (wordtype[wordnumber] == NOUNS) {
48                 if (testbit(location[position].objects, 
49                     wordvalue[wordnumber])) {
50                         pleasure++;
51                         printf("Kissed.\n");
52                         switch (wordvalue[wordnumber]) {
53                         case NORMGOD:
54                                 switch (godready++) {
55                                 case 0:
56                                         printf("She squirms and avoids your ");
57                                         puts("advances.");
58                                         break;
59                                 case 1:
60                                         puts("She is coming around; she ");
61                                         puts("didn't fight it as much.");
62                                         break;
63                                 case 2:
64                                         puts("She's beginning to like it.");
65                                         break;
66                                 default:
67                                         puts("She's gone limp.");
68
69                                 }
70                                 break;
71                         case NATIVE:
72                                 printf("Her lips are warm and her body ");
73                                 printf("robust.  She pulls you down to ");
74                                 puts("the ground.");
75                                 break;
76                         case TIMER:
77                                 puts("The old man blushes.");
78                                 break;
79                         case MAN:
80                                 puts("The dwarf punches you in the kneecap.");
81                                 break;
82                         default:
83                                 pleasure--;
84                         }
85                 } else
86                         puts("I see nothing like that here.");
87         } else
88                 puts("I'd prefer not to.");
89 }
90
91 void
92 love(void)
93 {
94         int     n;
95
96         while (wordtype[++wordnumber] != NOUNS && wordnumber <= wordcount)
97                 continue;
98         if (wordtype[wordnumber] == NOUNS) {
99                 if ((testbit(location[position].objects, BATHGOD) ||
100                     testbit(location[position].objects, NORMGOD)) &&
101                     wordvalue[wordnumber] == NORMGOD) {
102                         if (loved) {
103                                 printf("Loved.\n");
104                                 return;
105                         }
106                         if (godready >= 2) {
107                                 printf("She cuddles up to you, and her mouth ");
108                                 printf("starts to work:\n'That was my ");
109                                 printf("sister's amulet.  The lovely ");
110                                 printf("goddess, Purl, was she.  The Empire\n");
111                                 printf("captured her just after the Darkness ");
112                                 printf("came.  My other sister, Vert, was ");
113                                 printf("killed\nby the Dark Lord himself.  ");
114                                 printf("He took her amulet and warped its ");
115                                 printf("power.\nYour quest was foretold by ");
116                                 printf("my father before he died, but to get ");
117                                 printf("the Dark Lord's\namulet you must use ");
118                                 printf("cunning and skill.  I will leave you ");
119                                 puts("my amulet,");
120                                 printf("which you may use as you wish.  As ");
121                                 printf("for me, I am the last goddess of ");
122                                 printf("the\nwaters.  My father was the ");
123                                 printf("Island King, and the rule is ");
124                                 printf("rightfully mine.'\n\nShe pulls the ");
125                                 puts("throne out into a large bed.");
126                                 power++;
127                                 pleasure += 15;
128                                 ego++;
129                                 if (card(injuries, NUMOFINJURIES)) {
130                                         printf("Her kisses revive you; your ");
131                                         printf("wounds are healed.\n");
132                                         for (n = 0; n < NUMOFINJURIES; n++)
133                                                 injuries[n] = 0;
134                                         WEIGHT = MAXWEIGHT;
135                                         CUMBER = MAXCUMBER;
136                                 }
137                                 printf("Goddess:\n");
138                                 if (!loved)
139                                         setbit(location[position].objects, 
140                                             MEDALION);
141                                 loved = 1;
142                                 ourtime += 10;
143                                 printf("Loved.\n");
144                                 zzz();
145                                 return;
146                         } else {
147                                 puts("You wish!");
148                                 return;
149                         }
150                 }
151                 if (testbit(location[position].objects, 
152                     wordvalue[wordnumber])) {
153                         if (wordvalue[wordnumber] == NATIVE) {
154                                 printf("The girl is easy prey.  She peels ");
155                                 puts("off her sarong and indulges you.");
156                                 power++;
157                                 pleasure += 5;
158                                 printf("Girl:\n");
159                                 ourtime += 10;
160                                 printf("Loved.\n");
161                                 zzz();
162                         }
163                         if (wordvalue[wordnumber] == MAN ||
164                             wordvalue[wordnumber] == BODY ||
165                             wordvalue[wordnumber] == ELF ||
166                             wordvalue[wordnumber] == TIMER)
167                                 puts("Kinky!");
168                         else
169                                 puts("It doesn't seem to work.");
170                 } else
171                         puts("Where's your lover?");
172         } else
173                 puts("It doesn't seem to work.");
174 }
175
176 int
177 zzz(void)
178 {
179         int     oldtime;
180         int     n;
181         int zzztime;
182
183         zzztime = (3 * CYCLE) / 4;
184
185         oldtime = ourtime;
186         if ((snooze - ourtime) < zzztime) {
187                 ourtime += zzztime - (snooze - ourtime);
188                 printf("<zzz>");
189                 for (n = 0; n < ourtime - oldtime; n++)
190                         printf(".");
191                 printf("\n");
192                 snooze += 3 * (ourtime - oldtime);
193                 if (notes[LAUNCHED]) {
194                         fuel -= (ourtime - oldtime);
195                         if (location[position].down) {
196                                 position = location[position].down;
197                                 crash();
198                         } else
199                                 notes[LAUNCHED] = 0;
200                 }
201                 if (OUTSIDE && rnd(100) < 50) {
202                         printf("You are awakened abruptly by the sound ");
203                         puts("of someone nearby.");
204                         switch (rnd(4)) {
205                         case 0:
206                                 if (ucard(inven)) {
207                                         n = rnd(NUMOFOBJECTS);
208                                         while (!testbit(inven, n))
209                                                 n = rnd(NUMOFOBJECTS);
210                                         clearbit(inven, n);
211                                         if (n != AMULET && n != MEDALION && 
212                                             n != TALISMAN)
213                                                 setbit(
214                                                     location[position].objects,
215                                                     n);
216                                         carrying -= objwt[n];
217                                         encumber -= objcumber[n];
218                                 }
219                                 printf("A fiendish little Elf is stealing ");
220                                 puts("your treasures!");
221                                 fight(ELF, 10);
222                                 break;
223                         case 1:
224                                 setbit(location[position].objects, DEADWOOD);
225                                 break;
226                         case 2:
227                                 setbit(location[position].objects, HALBERD);
228                                 break;
229                         default:
230                                 break;
231                         }
232                 }
233         } else
234                 return (0);
235         return (1);
236 }
237
238 void
239 chime(void)
240 {
241         if ((ourtime / CYCLE + 1) % 2 && OUTSIDE)
242                 switch ((ourtime % CYCLE) / (CYCLE / 7)) {
243                 case 0:
244                         puts("It is just after sunrise.");
245                         break;
246                 case 1:
247                         puts("It is early morning.");
248                         break;
249                 case 2:
250                         puts("It is late morning.");
251                         break;
252                 case 3:
253                         puts("It is near noon.");
254                         break;
255                 case 4:
256                         puts("It is early afternoon.");
257                         break;
258                 case 5:
259                         puts("It is late afternoon.");
260                         break;
261                 case 6:
262                         puts("It is near sunset.");
263                         break;
264                 }
265         else if (OUTSIDE)
266                 switch ((ourtime % CYCLE) / (CYCLE / 7)) {
267                 case 0:
268                         puts("It is just after sunset.");
269                         break;
270                 case 1:
271                         puts("It is early evening.");
272                         break;
273                 case 2:
274                         puts("The evening is getting old.");
275                         break;
276                 case 3:
277                         puts("It is near midnight.");
278                         break;
279                 case 4:
280                         puts("These are the wee hours of the morning.");
281                         break;
282                 case 5:
283                         puts("The night is waning.");
284                         break;
285                 case 6:
286                         puts("It is almost morning.");
287                         break;
288                 }
289         else
290                 puts("I can't tell the time in here.");
291 }
292
293 int
294 give(void)
295 {
296         int     obj = -1, result = -1, person = 0, firstnumber, last1, last2;
297
298         last1 = last2 = 0;
299         firstnumber = wordnumber;
300         while (wordtype[++wordnumber] != OBJECT && 
301             wordvalue[wordnumber] != AMULET && 
302             wordvalue[wordnumber] != MEDALION && 
303             wordvalue[wordnumber] != TALISMAN && wordnumber <= wordcount)
304                 continue;
305         if (wordnumber <= wordcount) {
306                 obj = wordvalue[wordnumber];
307                 if (obj == EVERYTHING)
308                         wordtype[wordnumber] = -1;
309                 last1 = wordnumber;
310         }
311         wordnumber = firstnumber;
312         while ((wordtype[++wordnumber] != NOUNS || 
313             wordvalue[wordnumber] == obj) && wordnumber <= wordcount);
314         if (wordtype[wordnumber] == NOUNS) {
315                 person = wordvalue[wordnumber];
316                 last2 = wordnumber;
317         }
318         /* Setting wordnumber to last1 - 1 looks wrong if last1 is 0, e.g.,
319          * plain `give'.  However, detecting this case is liable to detect
320          * `give foo' as well, which would give a confusing error.  We
321          * need to make sure the -1 value can cause no problems if it arises.
322          * If in the below we get to the drop("Given") then drop will look
323          * at word 0 for an object to give, and fail, which is OK; then
324          * result will be -1 and we get to the end, where wordnumber gets
325          * set to something more sensible.  If we get to "I don't think
326          * that is possible" then again wordnumber is set to something
327          * sensible.  The wordnumber we leave with still isn't right if
328          * you include words the game doesn't know in your command, but
329          * that's no worse than what other commands than give do in
330          * the same place.  */
331         wordnumber = last1 - 1;
332         if (person && testbit(location[position].objects, person)) {
333                 if (person == NORMGOD && godready < 2 && 
334                     !(obj == RING || obj == BRACELET))
335                         puts("The goddess won't look at you.");
336                 else
337                         result = drop("Given");
338         } else {
339                 puts("I don't think that is possible.");
340                 wordnumber = max(last1, last2) + 1;
341                 return (0);
342         }
343         if (result != -1 && (testbit(location[position].objects, obj) || 
344             obj == AMULET || obj == MEDALION || obj == TALISMAN)) {
345                 clearbit(location[position].objects, obj);
346                 ourtime++;
347                 ego++;
348                 switch (person) {
349                 case NATIVE:
350                         puts("She accepts it shyly.");
351                         ego += 2;
352                         break;
353                 case NORMGOD:
354                         if (obj == RING || obj == BRACELET) {
355                                 printf("She takes the charm and puts it on.");
356                                 puts("  A little kiss on the cheek is");
357                                 puts("your reward.");
358                                 ego += 5;
359                                 godready += 3;
360                         }
361                         if (obj == AMULET || obj == MEDALION || 
362                             obj == TALISMAN) {
363                                 win++;
364                                 ego += 5;
365                                 power -= 5;
366                                 if (win >= 3) {
367                                         printf("The powers of the earth are ");
368                                         printf("now legitimate.  You have ");
369                                         puts("destroyed the Darkness");
370                                         printf("and restored the goddess to ");
371                                         printf("her throne.  The entire ");
372                                         puts("island celebrates with");
373                                         printf("dancing and spring feasts.  ");
374                                         printf("As a measure of her ");
375                                         puts("gratitude, the goddess weds you");
376                                         printf("in the late summer and ");
377                                         printf("crowns you Prince Liverwort, ");
378                                         puts("Lord of Fungus.");
379                                         printf("\nBut, as the year wears on ");
380                                         printf("and autumn comes along, you ");
381                                         puts("become restless and");
382                                         printf("yearn for adventure.  The ");
383                                         printf("goddess, too, realizes that ");
384                                         puts("the marriage can't last.");
385                                         printf("She becomes bored and takes ");
386                                         printf("several more natives as ");
387                                         puts("husbands.  One evening,");
388                                         printf("after having been out ");
389                                         printf("drinking with the girls, she ");
390                                         puts("kicks the throne particularly");
391                                         printf("hard and wakes you up.  (If ");
392                                         printf("you want to win this game, ");
393                                         printf("you're going to have to\n");
394                                         puts("shoot her!)");
395                                         clearbit(location[position].objects, 
396                                             MEDALION);
397                                         wintime = ourtime;
398                                 }
399                         }
400                         break;
401                 case TIMER:
402                         if (obj == COINS) {
403                                 printf("He fingers the coins for a moment ");
404                                 printf("and then looks up agape.  `Kind you ");
405                                 puts("are and");
406                                 printf("I mean to repay you as best I can.'  ");
407                                 printf("Grabbing a pencil and cocktail ");
408                                 puts("napkin...\n");
409                                 printf("+-----------------------------------");
410                                 printf("------------------------------------");
411                                 printf("------+\n");
412                                 printf("|                                  xxxxxxxx\\                                 |\n");
413                                 printf("|                                      xxxxx\\  CLIFFS                        |\n");
414                                 printf("|               FOREST                    xxx\\                               |\n");
415                                 printf("|                               \\\\         x\\                OCEAN                 |\n");
416                                 printf("|                               ||             x\\                            |\n");
417                                 printf("|                               ||  ROAD        x\\                           |\n");
418                                 printf("|                               ||              x\\                           |\n");
419                                 printf("|               SECRET          ||        .........                           |\n");
420                                 printf("|                - + -          ||         ........                           |\n");
421                                 printf("|               ENTRANCE        ||              ...      BEACH                |\n");
422                                 printf("|                               ||              ...               E           |\n");
423                                 printf("|                               ||              ...               |           |\n");
424                                 printf("|                               //              ...         N <-- + --- S     |\n");
425                                 printf("|               PALM GROVE     //               ...               |           |\n");
426                                 printf("|                             //                ...               W           |\n");
427                                 printf("+");
428                                 printf("---------------------------------");
429                                 printf("---------------------------------");
430                                 printf("-----------+\n");
431                                 printf("\n`This map shows a secret entrance ");
432                                 puts("to the catacombs.");
433                                 printf("You will know when you arrive ");
434                                 printf("because I left an old pair of shoes ");
435                                 puts("there.'");
436                         }
437                         break;
438                 }
439         }
440         wordnumber = max(last1, last2) + 1;
441         return (firstnumber);
442 }