1 /*        $NetBSD: command3.c,v 1.6 2021/05/02 12:50:43 rillig Exp $  */
2 
3 /*
4  * Copyright (c) 1983, 1993
5  *        The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 #include <sys/cdefs.h>
33 #ifndef lint
34 #if 0
35 static char sccsid[] = "@(#)com3.c      8.2 (Berkeley) 4/28/95";
36 #else
37 __RCSID("$NetBSD: command3.c,v 1.6 2021/05/02 12:50:43 rillig Exp $");
38 #endif
39 #endif                                  /* not lint */
40 
41 #include "extern.h"
42 
43 void
dig(void)44 dig(void)
45 {
46           if (testbit(inven, SHOVEL)) {
47                     puts("OK");
48                     ourtime++;
49                     switch (position) {
50                     case 144: /* copse near beach */
51                               if (!notes[DUG]) {
52                                         setbit(location[position].objects, DEADWOOD);
53                                         setbit(location[position].objects, COMPASS);
54                                         setbit(location[position].objects, KNIFE);
55                                         setbit(location[position].objects, MACE);
56                                         notes[DUG] = 1;
57                               }
58                               break;
59 
60                     default:
61                               puts("Nothing happens.");
62                     }
63           } else
64                     puts("You don't have a shovel.");
65 }
66 
67 int
jump(void)68 jump(void)
69 {
70           int     n;
71 
72           switch (position) {
73           default:
74                     puts("Nothing happens.");
75                     return (-1);
76 
77           case 242:
78                     position = 133;
79                     break;
80           case 214:
81           case 215:
82           case 162:
83           case 159:
84                     position = 145;
85                     break;
86           case 232:
87                     position = FINAL;
88                     break;
89           case 3:
90                     position = 1;
91                     break;
92           case 172:
93                     position = 201;
94           }
95           puts("Ahhhhhhh...");
96           injuries[12] = injuries[8] = injuries[7] = injuries[6] = 1;
97           for (n = 0; n < NUMOFOBJECTS; n++)
98                     if (testbit(inven, n)) {
99                               clearbit(inven, n);
100                               setbit(location[position].objects, n);
101                     }
102           carrying = 0;
103           encumber = 0;
104           return (0);
105 }
106 
107 void
bury(void)108 bury(void)
109 {
110           int     value;
111 
112           if (testbit(inven, SHOVEL)) {
113                     while (wordtype[++wordnumber] != OBJECT &&
114                         wordtype[wordnumber] != NOUNS && wordnumber < wordcount)
115                               continue;
116                     value = wordvalue[wordnumber];
117                     if (wordtype[wordnumber] == NOUNS &&
118                         (testbit(location[position].objects, value) ||
119                         value == BODY))
120                               switch (value) {
121                               case BODY:
122                                         wordtype[wordnumber] = OBJECT;
123                                         if (testbit(inven, MAID) ||
124                                             testbit(location[position].objects, MAID))
125                                                   value = MAID;
126                                         if (testbit(inven, DEADWOOD) ||
127                                             testbit(location[position].objects,
128                                                   DEADWOOD))
129                                                   value = DEADWOOD;
130                                         if (testbit(inven, DEADGOD) ||
131                                             testbit(location[position].objects,
132                                                   DEADGOD))
133                                                   value = DEADGOD;
134                                         if (testbit(inven, DEADTIME) ||
135                                             testbit(location[position].objects,
136                                                   DEADTIME))
137                                                   value = DEADTIME;
138                                         if (testbit(inven, DEADNATIVE) ||
139                                             testbit(location[position].objects,
140                                                   DEADNATIVE))
141                                                   value = DEADNATIVE;
142                                         break;
143 
144                               case NATIVE:
145                               case NORMGOD:
146                                         printf("She screams as you wrestle her into ");
147                                         puts("the hole.");
148                                         /* FALLTHROUGH */
149                               case TIMER:
150                                         power += 7;
151                                         ego -= 10;
152                                         /* FALLTHROUGH */
153                               case AMULET:
154                               case MEDALION:
155                               case TALISMAN:
156                                         wordtype[wordnumber] = OBJECT;
157                                         break;
158 
159                               default:
160                                         puts("Wha..?");
161                               }
162                     if (wordtype[wordnumber] == OBJECT && position > 88 &&
163                         (testbit(inven, value) ||
164                         testbit(location[position].objects, value))) {
165                               puts("Buried.");
166                               if (testbit(inven, value)) {
167                                         clearbit(inven, value);
168                                         carrying -= objwt[value];
169                                         encumber -= objcumber[value];
170                               }
171                               clearbit(location[position].objects, value);
172                               switch (value) {
173                               case MAID:
174                               case DEADWOOD:
175                               case DEADNATIVE:
176                               case DEADTIME:
177                               case DEADGOD:
178                                         ego += 2;
179                                         printf("The %s should rest easier now.\n",
180                                             objsht[value]);
181                               }
182                     } else
183                               puts("It doesn't seem to work.");
184           } else
185                     puts("You aren't holding a shovel.");
186 }
187 
188 void
drink(void)189 drink(void)
190 {
191           int     n;
192 
193           if (testbit(inven, POTION)) {
194                     printf("The cool liquid runs down your throat but turns to ");
195                     puts("fire and you choke.");
196                     printf("The heat reaches your limbs and tingles your spirit.");
197                     puts("  You feel like falling");
198                     puts("asleep.");
199                     clearbit(inven, POTION);
200                     WEIGHT = MAXWEIGHT;
201                     CUMBER = MAXCUMBER;
202                     for (n = 0; n < NUMOFINJURIES; n++)
203                               injuries[n] = 0;
204                     ourtime++;
205                     zzz();
206           } else
207                     puts("I'm not thirsty.");
208 }
209 
210 int
shoot(void)211 shoot(void)
212 {
213           int     firstnumber, value;
214 
215           firstnumber = wordnumber;
216           if (!testbit(inven, LASER))
217                     puts("You aren't holding a blaster.");
218           else {
219                     wordnumber++;
220                     while (wordnumber <= wordcount &&
221                         wordtype[wordnumber] == OBJECT) {
222                               value = wordvalue[wordnumber];
223                               printf("%s:\n", objsht[value]);
224                               if (testbit(location[position].objects, value)) {
225                                         clearbit(location[position].objects, value);
226                                         ourtime++;
227                                         printf("The %s explode%s\n", objsht[value],
228                                             (is_plural_object(value) ? "." : "s."));
229                                         if (value == BOMB)
230                                                   die();
231                               } else
232                                         printf("I don't see any %s around here.\n",
233                                             objsht[value]);
234                               if (wordnumber < wordcount - 1 &&
235                                   wordvalue[++wordnumber] == AND)
236                                         wordnumber++;
237                               else
238                                         return (firstnumber);
239                     }
240                     /* special cases with their own return()'s */
241 
242                     if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS) {
243                               ourtime++;
244                               switch (wordvalue[wordnumber]) {
245 
246                               case DOOR:
247                                         switch (position) {
248                                         case 189:
249                                         case 231:
250                                                   puts("The door is unhinged.");
251                                                   location[189].north = 231;
252                                                   location[231].south = 189;
253                                                   whichway(location[position]);
254                                                   break;
255                                         case 30:
256                                                   puts("The wooden door splinters.");
257                                                   location[30].west = 25;
258                                                   whichway(location[position]);
259                                                   break;
260                                         case 31:
261                                                   printf("The laser blast has no ");
262                                                   puts("effect on the door.");
263                                                   break;
264                                         case 20:
265                                                   printf("The blast hits the door and ");
266                                                   printf("it explodes into flame.  The ");
267                                                   puts("magnesium burns");
268                                                   printf("so rapidly that we have no ");
269                                                   puts("chance to escape.");
270                                                   die();
271                                         default:
272                                                   puts("Nothing happens.");
273                                         }
274                                         break;
275 
276                               case NORMGOD:
277                                         if (testbit(location[position].objects,
278                                             BATHGOD)) {
279                                                   printf("The goddess is hit in the ");
280                                                   printf("chest and splashes back ");
281                                                   puts("against the rocks.");
282                                                   printf("Dark blood oozes from the ");
283                                                   printf("charred blast hole.  Her ");
284                                                   puts("naked body floats in the");
285                                                   puts("pools and then off downstream.");
286                                                   clearbit(location[position].objects,
287                                                       BATHGOD);
288                                                   setbit(location[180].objects, DEADGOD);
289                                                   power += 5;
290                                                   ego -= 10;
291                                                   notes[JINXED]++;
292                                         } else
293                                                   if (testbit(location[position].objects,
294                                                       NORMGOD)) {
295                                                             printf("The blast catches ");
296                                                             printf("the goddess in the ");
297                                                             printf("stomach, knocking ");
298                                                             puts("her to the ground.");
299                                                             printf("She writhes in the ");
300                                                             printf("dirt as the agony of ");
301                                                             puts("death taunts her.");
302                                                             puts("She has stopped moving.");
303                                                             clearbit(location[position].objects, NORMGOD);
304                                                             setbit(location[position].objects, DEADGOD);
305                                                             power += 5;
306                                                             ego -= 10;
307                                                             notes[JINXED]++;
308                                                             if (wintime)
309                                                                       live();
310                                                             break;
311                                                   } else {
312                                                             printf("I don't see any ");
313                                                             puts("goddess around here.");
314                                                   }
315                                         break;
316 
317                               case TIMER:
318                                         if (testbit(location[position].objects,
319                                             TIMER)) {
320                                                   printf("The old man slumps over ");
321                                                   puts("the bar.");
322                                                   power++;
323                                                   ego -= 2;
324                                                   notes[JINXED]++;
325                                                   clearbit(location[position].objects,
326                                                       TIMER);
327                                                   setbit(location[position].objects,
328                                                       DEADTIME);
329                                         } else
330                                                   puts("What old-timer?");
331                                         break;
332                               case MAN:
333                                         if (testbit(location[position].objects, MAN)) {
334                                                   printf("The man falls to the ground ");
335                                                   printf("with blood pouring all over ");
336                                                   puts("his white suit.");
337                                                   puts("Your fantasy is over.");
338                                                   die();
339                                         } else
340                                                   puts("What man?");
341                                         break;
342                               case NATIVE:
343                                         if (testbit(location[position].objects,
344                                             NATIVE)) {
345                                                   printf("The girl is blown backwards ");
346                                                   printf("several feet and lies in a ");
347                                                   puts("pool of blood.");
348                                                   clearbit(location[position].objects,
349                                                       NATIVE);
350                                                   setbit(location[position].objects,
351                                                       DEADNATIVE);
352                                                   power += 5;
353                                                   ego -= 2;
354                                                   notes[JINXED]++;
355                                         } else
356                                                   puts("There is no girl here.");
357                                         break;
358                               case -1:
359                                         puts("Shoot what?");
360                                         break;
361 
362                               default:
363                                         printf("You can't shoot the %s.\n",
364                                             objsht[wordvalue[wordnumber]]);
365                               }
366                     } else
367                               puts("You must be a looney.");
368           }
369           return (firstnumber);
370 }
371