xref: /dragonfly/games/battlestar/command2.c (revision 4318c66eac379e15105fe145d406dfef81b795f6)
1 /*        @(#)com2.c          8.2 (Berkeley) 4/28/95                            */
2 /*        $NetBSD: command2.c,v 1.4 2019/02/03 03:19:25 mrg 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 int
wearit(void)36 wearit(void)
37 {                                       /* synonyms = {sheathe, sheath} */
38           int     firstnumber, value;
39 
40           firstnumber = wordnumber;
41           wordnumber++;
42           while (wordnumber <= wordcount && (wordtype[wordnumber] == OBJECT ||
43               wordtype[wordnumber] == NOUNS) && wordvalue[wordnumber] != DOOR) {
44                     value = wordvalue[wordnumber];
45                     if (value >= 0 && objsht[value] == NULL)
46                               break;
47                     switch (value) {
48 
49                     case -1:
50                               puts("Wear what?");
51                               return (firstnumber);
52 
53                     default:
54                               printf("You can't wear %s%s!\n",
55                                   A_OR_AN_OR_BLANK(value), objsht[value]);
56                               return (firstnumber);
57 
58                     case KNIFE:
59                               /* case SHIRT:       */
60                     case ROBE:
61                     case LEVIS:         /* wearable things */
62                     case SWORD:
63                     case MAIL:
64                     case HELM:
65                     case SHOES:
66                     case PAJAMAS:
67                     case COMPASS:
68                     case LASER:
69                     case AMULET:
70                     case TALISMAN:
71                     case MEDALION:
72                     case ROPE:
73                     case RING:
74                     case BRACELET:
75                     case GRENADE:
76 
77                               if (testbit(inven, value)) {
78                                         clearbit(inven, value);
79                                         setbit(wear, value);
80                                         carrying -= objwt[value];
81                                         encumber -= objcumber[value];
82                                         ourtime++;
83                                         printf("You are now wearing %s%s.\n",
84                                             A_OR_AN_OR_THE(value), objsht[value]);
85                               } else
86                                         if (testbit(wear, value)) {
87                                                   printf("You are already wearing the %s",
88                                                       objsht[value]);
89                                                   printf(".\n");
90                                         } else
91                                                   printf("You aren't holding the %s.\n",
92                                                       objsht[value]);
93                               if (wordnumber < wordcount - 1 &&
94                                   wordvalue[++wordnumber] == AND)
95                                         wordnumber++;
96                               else
97                                         return (firstnumber);
98                     }                   /* end switch */
99           }                             /* end while */
100           puts("Don't be ridiculous.");
101           return (firstnumber);
102 }
103 
104 int
put(void)105 put(void)
106 {                                       /* synonyms = {buckle, strap, tie} */
107           if (wordvalue[wordnumber + 1] == ON) {
108                     wordvalue[++wordnumber] = PUTON;
109                     wordtype[wordnumber] = VERB;
110                     return (cypher());
111           }
112           if (wordvalue[wordnumber + 1] == DOWN) {
113                     wordvalue[++wordnumber] = DROP;
114                     wordtype[wordnumber] = VERB;
115                     return (cypher());
116           }
117           puts("I don't understand what you want to put.");
118           return (-1);
119 
120 }
121 
122 int
draw(void)123 draw(void)
124 {                                       /* synonyms = {pull, carry} */
125           return (take(wear));
126 }
127 
128 int
use(void)129 use(void)
130 {
131           wordnumber++;
132           if (wordvalue[wordnumber] == AMULET && testbit(inven, AMULET) &&
133               position != FINAL) {
134                     puts("The amulet begins to glow.");
135                     if (testbit(inven, MEDALION)) {
136                               puts("The medallion comes to life too.");
137                               if (position == 114) {
138                                         location[position].down = 160;
139                                         whichway(location[position]);
140                                         printf("The waves subside and it is possible ");
141                                         puts("to descend to the sea cave now.");
142                                         ourtime++;
143                                         return (-1);
144                               }
145                     }
146                     printf("A light mist falls over your eyes and the sound of ");
147                     puts("purling water trickles in");
148                     printf("your ears.   When the mist lifts you are standing ");
149                     puts("beside a cool stream.");
150                     if (position == 229)
151                               position = 224;
152                     else
153                               position = 229;
154                     ourtime++;
155                     notes[CANTSEE] = 0;
156                     return (0);
157           } else if (position == FINAL)
158                     puts("The amulet won't work in here.");
159           else if (wordvalue[wordnumber] == COMPASS && testbit(inven, COMPASS))
160                     printf("Your compass points %s.\n", truedirec(NORTH, '-'));
161           else if (wordvalue[wordnumber] == COMPASS)
162                     puts("You aren't holding the compass.");
163           else if (wordvalue[wordnumber] == AMULET)
164                     puts("You aren't holding the amulet.");
165           else
166                     puts("There is no apparent use.");
167           return (-1);
168 }
169 
170 void
murder(void)171 murder(void)
172 {
173           int     n;
174 
175           for (n = 0;
176               !((n == SWORD || n == KNIFE || n == TWO_HANDED || n == MACE ||
177                   n == CLEAVER || n == BROAD || n == CHAIN || n == SHOVEL ||
178                   n == HALBERD) && testbit(inven, n)) && n < NUMOFOBJECTS;
179               n++);
180           if (n == NUMOFOBJECTS) {
181                     if (testbit(inven, LASER)) {
182                               printf("Your laser should do the trick.\n");
183                               wordnumber++;
184                               switch(wordvalue[wordnumber]) {
185                               case NORMGOD:
186                               case TIMER:
187                               case NATIVE:
188                               case MAN:
189                                         wordvalue[--wordnumber] = SHOOT;
190                                         cypher();
191                                         break;
192                               case -1:
193                                         puts("Kill what?");
194                                         break;
195                               default:
196                                         if (wordtype[wordnumber] != OBJECT ||
197                                             wordvalue[wordnumber] == EVERYTHING)
198                                                   puts("You can't kill that!");
199                                         else
200                                                   printf("You can't kill %s%s!\n",
201                                                       A_OR_AN_OR_BLANK(wordvalue[wordnumber]),
202                                                       objsht[wordvalue[wordnumber]]);
203                                         break;
204                               }
205                     } else
206                               puts("You don't have suitable weapons to kill.");
207           } else {
208                     printf("Your %s should do the trick.\n", objsht[n]);
209                     wordnumber++;
210                     switch (wordvalue[wordnumber]) {
211 
212                     case NORMGOD:
213                               if (testbit(location[position].objects, BATHGOD)) {
214                                         printf("The goddess's head slices off.  Her ");
215                                         puts("corpse floats in the water.");
216                                         clearbit(location[position].objects, BATHGOD);
217                                         setbit(location[position].objects, DEADGOD);
218                                         power += 5;
219                                         notes[JINXED]++;
220                               } else
221                                         if (testbit(location[position].objects,
222                                             NORMGOD)) {
223                                                   printf("The goddess pleads but you ");
224                                                   printf("strike her mercilessly.  Her ");
225                                                   printf("broken body lies in a\n");
226                                                   puts("pool of blood.");
227                                                   clearbit(location[position].objects,
228                                                       NORMGOD);
229                                                   setbit(location[position].objects,
230                                                       DEADGOD);
231                                                   power += 5;
232                                                   notes[JINXED]++;
233                                                   if (wintime)
234                                                             live();
235                                         } else
236                                                   puts("I don't see her anywhere.");
237                               break;
238                     case TIMER:
239                               if (testbit(location[position].objects, TIMER)) {
240                                         puts("The old man offers no resistance.");
241                                         clearbit(location[position].objects, TIMER);
242                                         setbit(location[position].objects, DEADTIME);
243                                         power++;
244                                         notes[JINXED]++;
245                               } else
246                                         puts("Who?");
247                               break;
248                     case NATIVE:
249                               if (testbit(location[position].objects, NATIVE)) {
250                                         printf("The girl screams as you cut her ");
251                                         puts("body to shreds.  She is dead.");
252                                         clearbit(location[position].objects, NATIVE);
253                                         setbit(location[position].objects, DEADNATIVE);
254                                         power += 5;
255                                         notes[JINXED]++;
256                               } else
257                                         puts("What girl?");
258                               break;
259                     case MAN:
260                               if (testbit(location[position].objects, MAN)) {
261                                         printf("You strike him to the ground, and ");
262                                         puts("he coughs up blood.");
263                                         puts("Your fantasy is over.");
264                                         die();
265                               }
266                               /* FALLTHROUGH */
267                     case -1:
268                               puts("Kill what?");
269                               break;
270 
271                     default:
272                               if (wordtype[wordnumber] != OBJECT ||
273                                   wordvalue[wordnumber] == EVERYTHING)
274                                         puts("You can't kill that!");
275                               else
276                                         printf("You can't kill the %s!\n",
277                                             objsht[wordvalue[wordnumber]]);
278                     }
279           }
280 }
281 
282 void
ravage(void)283 ravage(void)
284 {
285           while (wordtype[++wordnumber] != NOUNS && wordnumber <= wordcount)
286                     continue;
287           if (wordtype[wordnumber] == NOUNS &&
288               (testbit(location[position].objects, wordvalue[wordnumber])
289               || (wordvalue[wordnumber] == NORMGOD &&
290                   testbit(location[position].objects, BATHGOD)))) {
291                     ourtime++;
292                     switch (wordvalue[wordnumber]) {
293                     case NORMGOD:
294                               printf("You attack the goddess, and she screams as ");
295                               puts("you beat her.  She falls down");
296                               if (testbit(location[position].objects, BATHGOD)) {
297                                         printf("crying and tries to cover her ");
298                                         puts("nakedness.");
299                               } else {
300                                         printf("crying and tries to hold her torn ");
301                                         puts("and bloodied dress around her.");
302                               }
303                               power += 5;
304                               pleasure += 8;
305                               ego -= 10;
306                               wordnumber--;
307                               godready = -30000;
308                               murder();
309                               win = -30000;
310                               break;
311                     case NATIVE:
312                               printf("The girl tries to run, but you catch her and ");
313                               puts("throw her down.  Her face is");
314                               printf("bleeding, and she screams as you tear off ");
315                               puts("her clothes.");
316                               power += 3;
317                               pleasure += 5;
318                               ego -= 10;
319                               wordnumber--;
320                               murder();
321                               if (rnd(100) < 50) {
322                                         printf("Her screams have attracted ");
323                                         puts("attention.  I think we are surrounded.");
324                                         setbit(location[ahead].objects, WOODSMAN);
325                                         setbit(location[ahead].objects, DEADWOOD);
326                                         setbit(location[ahead].objects, MALLET);
327                                         setbit(location[back].objects, WOODSMAN);
328                                         setbit(location[back].objects, DEADWOOD);
329                                         setbit(location[back].objects, MALLET);
330                                         setbit(location[left].objects, WOODSMAN);
331                                         setbit(location[left].objects, DEADWOOD);
332                                         setbit(location[left].objects, MALLET);
333                                         setbit(location[right].objects, WOODSMAN);
334                                         setbit(location[right].objects, DEADWOOD);
335                                         setbit(location[right].objects, MALLET);
336                               }
337                               break;
338                     default:
339                               puts("You are perverted.");
340                     }
341           } else
342                     puts("Who?");
343 }
344 
345 int
follow(void)346 follow(void)
347 {
348           if (followfight == ourtime) {
349                     printf("The Dark Lord leaps away and runs down secret ");
350                     puts("tunnels and corridors.");
351                     printf("You chase him through the darkness and splash in ");
352                     puts("pools of water.");
353                     printf("You have cornered him.  His laser sword extends ");
354                     puts("as he steps forward.");
355                     position = FINAL;
356                     fight(DARK, 75);
357                     setbit(location[position].objects, TALISMAN);
358                     setbit(location[position].objects, AMULET);
359                     return (0);
360           } else
361                     if (followgod == ourtime) {
362                               printf("The goddess leads you down a steamy tunnel ");
363                               puts("and into a high, wide chamber.");
364                               puts("She sits down on a throne.");
365                               position = 268;
366                               setbit(location[position].objects, NORMGOD);
367                               notes[CANTSEE] = 1;
368                               return (0);
369                     } else
370                               puts("There is no one to follow.");
371           return (-1);
372 }
373