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