FREAD -> O_RDONLY
[unix-history] / usr / src / games / battlestar / com4.c
CommitLineData
fdc7d56f 1/*
e95fc82a
KB
2 * Copyright (c) 1983 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
28c5bacc
KB
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
fdc7d56f
EW
16 */
17
1ddef5f0 18#ifndef lint
83b6ceb0 19static char sccsid[] = "@(#)com4.c 5.3 (Berkeley) %G%";
e95fc82a 20#endif /* not lint */
1ddef5f0
EW
21
22#include "externs.h"
23
24take(from)
25unsigned int from[];
26{
27 int firstnumber, heavy, bulky, value;
28 register int n;
29
30 firstnumber = wordnumber;
31 if (wordnumber < wordcount && wordvalue[wordnumber+1] == OFF){
32 wordnumber++;
33 wordvalue[wordnumber] = TAKEOFF;
34 return(cypher());
35 }
36 else {
37 while(wordtype[++wordnumber] == ADJS);
38 while(wordnumber<=wordcount && wordtype[wordnumber] == OBJECT){
39 value = wordvalue[wordnumber];
40 printf("%s:\n", objsht[value]);
41 for (n=0; objsht[value][n]; n++);
42 heavy = (carrying + objwt[value]) <= WEIGHT;
43 bulky = (encumber + objcumber[value]) <= CUMBER;
44 if ((testbit(from,value) || wiz || tempwiz) && heavy && bulky && !testbit(inven,value)){
45 setbit(inven,value);
46 carrying += objwt[value];
47 encumber += objcumber[value];
48 time++;
49 if (testbit(from,value))
50 printf("Taken.\n");
51 else
52 printf("Zap! Taken from thin air.\n");
53 clearbit(from,value);
54 if (value == MEDALION)
55 win--;
56 }
57 else if (testbit(inven,value))
58 printf("You're already holding%s%s.\n", (objsht[value][n-1] == 's' ? " " : " a "),objsht[value]);
59 else if (!heavy)
60 printf("The %s %s too heavy.\n", objsht[value],(objsht[value][n-1] == 's' ? "are" : "is"));
61 else if (!bulky)
62 printf("The %s %s too cumbersome to hold.\n", objsht[value],(objsht[value][n-1] == 's' ? "are" : "is"));
63 else
64 printf("I dont see any %s around here.\n", objsht[value]);
65 if (wordnumber < wordcount -1 && wordvalue[++wordnumber] == AND)
66 wordnumber++;
67 else
68 return(firstnumber);
69 }
70 }
71 /* special cases with their own return()'s */
72
73 if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS)
74 switch(wordvalue[wordnumber]){
75
76 case SWORD:
77 if (testbit(from, SWORD)){
78 wordtype[wordnumber--] = OBJECT;
79 return(take(from));
80 }
81 if (testbit(from, TWO_HANDED)){
82 wordvalue[wordnumber] = TWO_HANDED;
83 wordtype[wordnumber--] = OBJECT;
84 return(take(from));
85 }
86 wordvalue[wordnumber] = BROAD;
87 wordtype[wordnumber--] = OBJECT;
88 return(take(from));
89
90 case BODY:
91 if (testbit(from,MAID)){
92 wordvalue[wordnumber] = MAID;
93 wordtype[wordnumber--] = OBJECT;
94 return(take(from));
95 }
96 else if (testbit(from,DEADWOOD)){
97 wordvalue[wordnumber] = DEADWOOD;
98 wordtype[wordnumber--] = OBJECT;
99 return(take(from));
100 }
101 else if (testbit(from,DEADNATIVE)){
102 wordvalue[wordnumber] = DEADNATIVE;
103 wordtype[wordnumber--] = OBJECT;
104 return(take(from));
105 }
106 else if (testbit(from,DEADGOD)){
107 wordvalue[wordnumber] = DEADGOD;
108 wordtype[wordnumber--] = OBJECT;
109 return(take(from));
110 }
111 else {
112 wordvalue[wordnumber] = DEADTIME;
113 wordtype[wordnumber--] = OBJECT;
114 return(take(from));
115 }
116 break;
117
118 case AMULET:
119 if (testbit(location[position].objects,AMULET)){
a7c71d1e
EW
120 puts("The amulet is warm to the touch, and its beauty catches your breath.");
121 puts("A mist falls over your eyes, but then it is gone. Sounds seem clearer");
1ddef5f0 122 puts("and sharper but far away as if in a dream. The sound of purling water reaches");
a7c71d1e 123 puts("you from afar. The mist falls again, and your heart leaps in horror. The gold");
1ddef5f0
EW
124 puts("freezes your hands and fathomless darkness engulfs your soul.");
125 }
126 wordtype[wordnumber--] = OBJECT;
127 return(take(from));
128
129 case MEDALION:
130 if (testbit(location[position].objects, MEDALION)){
a7c71d1e 131 puts("The medallion is warm, and it rekindles your spirit with the warmth of life.");
1ddef5f0
EW
132 puts("Your amulet begins to glow as the medallion is brought near to it, and together\nthey radiate.");
133 }
134 wordtype[wordnumber--] = OBJECT;
135 return(take(from));
136
137 case TALISMAN:
138 if (testbit(location[position].objects,TALISMAN)){
a7c71d1e 139 puts("The talisman is cold to the touch, and it sends a chill down your spine.");
1ddef5f0
EW
140 }
141 wordtype[wordnumber--] = OBJECT;
142 return(take(from));
143
144 case NORMGOD:
145 if (testbit(location[position].objects,BATHGOD) && (testbit(wear,AMULET) || testbit(inven,AMULET))){
a7c71d1e 146 puts("She offers a delicate hand, and you help her out of the sparkling springs.");
1ddef5f0
EW
147 puts("Water droplets like liquid silver bedew her golden skin, but when they part");
148 puts("from her, they fall as teardrops. She wraps a single cloth around her and");
149 puts("ties it at the waist. Around her neck hangs a golden amulet.");
150 puts("She bids you to follow her.");
151 pleasure++;
152 followgod = time;
153 clearbit(location[position].objects,BATHGOD);
154 } else if (!testbit(location[position].objects,BATHGOD))
155 puts("You're in no position to take her.");
156 else
157 puts("She moves away from you.");
158 break;
159
160 default:
161 puts("It doesn't seem to work.");
162 }
163 else
164 puts("You've got to be kidding.");
165 return(firstnumber);
166}
167
a7c71d1e
EW
168throw(name)
169 char *name;
1ddef5f0
EW
170{
171 int n;
172 int deposit = 0;
173 int first, value;
174
175 first = wordnumber;
a7c71d1e 176 if (drop(name) != -1){
1ddef5f0
EW
177 switch(wordvalue[wordnumber]){
178
179 case AHEAD:
180 deposit = ahead;
181 break;
182
183 case BACK:
184 deposit = back;
185 break;
186
187 case LEFT:
188 deposit = left;
189 break;
190
191 case RIGHT:
192 deposit = right;
193 break;
194
195 case UP:
196 deposit = location[position].up * (location[position].access || position == FINAL);
197 break;
198
199 case DOWN:
200 deposit = location[position].down;
201 break;
202 }
203 wordnumber = first;
204 while (wordtype[++wordnumber] == ADJS);
205 while (wordnumber <= wordcount){
206 value = wordvalue[wordnumber];
207 if (deposit && testbit(location[position].objects,value)){
208 clearbit(location[position].objects,value);
209 if (value != GRENADE)
210 setbit(location[deposit].objects,value);
211 else{
212 puts("A thundering explosion nearby sends up a cloud of smoke and shrapnel.");
213 for (n = 0; n < NUMOFWORDS; n ++)
214 location[deposit].objects[n] = 0;
215 setbit(location[deposit].objects,CHAR);
216 }
217 if (value == ROPE && position == FINAL)
218 location[position].access = 1;
219 switch(deposit){
220 case 189:
221 case 231:
222 puts("The stone door is unhinged.");
223 location[189].north = 231;
224 location[231].south = 189;
225 break;
226 case 30:
227 puts("The wooden door is blown open.");
228 location[30].west = 25;
229 break;
230 case 31:
231 puts("The door is not damaged.");
232 }
233 }
234 else if (value == GRENADE && testbit(location[position].objects,value)){
235 puts("You are blown into shreds when your grenade explodes.");
236 die();
237 }
238 if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
239 wordnumber++;
240 else
241 return(first);
242 }
243 return(first);
244 }
245 return(first);
246}
247
248drop(name)
249char *name;
250{
251
252 int firstnumber, value;
253
254 firstnumber = wordnumber;
a7c71d1e
EW
255 while (wordtype[++wordnumber] == ADJS)
256 ;
257 while (wordnumber<=wordcount && (wordtype[wordnumber] == OBJECT || wordtype[wordnumber] == NOUNS)) {
1ddef5f0
EW
258 value = wordvalue[wordnumber];
259 printf("%s:\n", objsht[value]);
260 if (testbit(inven,value)){
261 clearbit(inven,value);
262 carrying -= objwt[value];
263 encumber -= objcumber[value];
264 if (value == BOMB){
265 puts("The bomb explodes. A blinding white light and immense concussion obliterate us.");
266 die();
267 }
268 if (value != AMULET && value != MEDALION && value != TALISMAN)
269 setbit(location[position].objects,value);
270 else
271 tempwiz = 0;
272 time++;
a7c71d1e
EW
273 if (*name == 'K')
274 puts("Drop kicked.");
275 else
276 printf("%s.\n", name);
1ddef5f0
EW
277 }
278 else {
a7c71d1e
EW
279 if (*name != 'K') {
280 printf("You aren't holding the %s.\n", objsht[value]);
281 if (testbit(location[position].objects,value)) {
282 if (*name == 'T')
283 puts("Kicked instead.");
284 else if (*name == 'G')
285 puts("Given anyway.");
286 }
287 } else
288 puts("Kicked.");
1ddef5f0
EW
289 }
290 if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
291 wordnumber++;
292 else
293 return(firstnumber);
294 }
295 puts("Do what?");
296 return(-1);
297}
298
299takeoff()
300{
301 wordnumber = take(wear);
302 return(drop("Dropped"));
303}
304
305puton()
306{
307 wordnumber = take(location[position].objects);
308 return(wearit());
309}
310
311eat()
312{
1ddef5f0
EW
313 int firstnumber, value;
314
315 firstnumber = wordnumber;
316 while(wordtype[++wordnumber] == ADJS);
317 while(wordnumber <= wordcount){
318 value = wordvalue[wordnumber];
1ddef5f0
EW
319 switch(value){
320
321 case -1:
322 puts("Eat what?");
323 return(firstnumber);
324
325 default:
83b6ceb0
EW
326 printf("You can't eat%s%s!\n",
327 wordtype[wordnumber] == OBJECT &&
328 objsht[value]
329 [strlen(objsht[value]) - 1] == 's' ?
330 " " : " a ",
331 words[wordnumber]);
1ddef5f0
EW
332 return(firstnumber);
333
334 case PAPAYAS:
335 case PINEAPPLE:
336 case KIWI:
337 case COCONUTS: /* eatable things */
338 case MANGO:
339
340 printf("%s:\n",objsht[value]);
341 if (testbit(inven,value) && time > ate - CYCLE && testbit(inven,KNIFE)){
342 clearbit(inven,value);
343 carrying -= objwt[value];
344 encumber -= objcumber[value];
345 ate = max(time,ate) + CYCLE/3;
346 snooze += CYCLE/10;
347 time++;
a7c71d1e 348 puts("Eaten. You can explore a little longer now.");
1ddef5f0
EW
349 }
350 else if (time < ate - CYCLE)
a7c71d1e 351 puts("You're stuffed.");
1ddef5f0
EW
352 else if (!testbit(inven,KNIFE))
353 puts("You need a knife.");
354 else
355 printf("You aren't holding the %s.\n", objsht[value]);
356 if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
357 wordnumber++;
358 else
359 return(firstnumber);
360 } /* end switch */
361 } /* end while */
362 return(firstnumber);
a7c71d1e 363}