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