xref: /original-bsd/games/battlestar/com4.c (revision 5df75cf2)
1109e8aa7Sedward /*
23f0b606cSbostic  * Copyright (c) 1983, 1993
33f0b606cSbostic  *	The Regents of the University of California.  All rights reserved.
41f2fb9e6Sbostic  *
526fc2bc9Sbostic  * %sccs.include.redist.c%
6109e8aa7Sedward  */
7109e8aa7Sedward 
8849ca828Sedward #ifndef lint
9*5df75cf2Sbostic static char sccsid[] = "@(#)com4.c	8.2 (Berkeley) 04/28/95";
101f2fb9e6Sbostic #endif /* not lint */
11849ca828Sedward 
12*5df75cf2Sbostic #include "extern.h"
13849ca828Sedward 
take(from)14849ca828Sedward take(from)
15849ca828Sedward unsigned int from[];
16849ca828Sedward {
17849ca828Sedward 	int firstnumber, heavy, bulky, value;
18849ca828Sedward 	register int n;
19849ca828Sedward 
20849ca828Sedward 	firstnumber = wordnumber;
21849ca828Sedward 	if (wordnumber < wordcount && wordvalue[wordnumber+1] == OFF){
22849ca828Sedward 		wordnumber++;
23849ca828Sedward 		wordvalue[wordnumber] = TAKEOFF;
24849ca828Sedward 		return(cypher());
25849ca828Sedward 	}
26849ca828Sedward 	else {
27849ca828Sedward 		while(wordtype[++wordnumber] == ADJS);
28849ca828Sedward 		while(wordnumber<=wordcount && wordtype[wordnumber] == OBJECT){
29849ca828Sedward 			value = wordvalue[wordnumber];
30849ca828Sedward 			printf("%s:\n", objsht[value]);
31849ca828Sedward 			for (n=0; objsht[value][n]; n++);
32849ca828Sedward 			heavy = (carrying + objwt[value]) <= WEIGHT;
33849ca828Sedward 			bulky = (encumber + objcumber[value]) <= CUMBER;
34849ca828Sedward 			if ((testbit(from,value) || wiz || tempwiz) && heavy && bulky && !testbit(inven,value)){
35849ca828Sedward 				setbit(inven,value);
36849ca828Sedward 				carrying += objwt[value];
37849ca828Sedward 				encumber += objcumber[value];
38849ca828Sedward 				time++;
39849ca828Sedward 				if (testbit(from,value))
40849ca828Sedward 					printf("Taken.\n");
41849ca828Sedward 				else
42849ca828Sedward 					printf("Zap! Taken from thin air.\n");
43849ca828Sedward 				clearbit(from,value);
44849ca828Sedward 				if (value == MEDALION)
45849ca828Sedward 					win--;
46849ca828Sedward 			}
47849ca828Sedward 			else if (testbit(inven,value))
48849ca828Sedward 				printf("You're already holding%s%s.\n", (objsht[value][n-1] == 's' ? " " : " a "),objsht[value]);
49849ca828Sedward 			else if (!heavy)
50849ca828Sedward 				printf("The %s %s too heavy.\n", objsht[value],(objsht[value][n-1] == 's' ? "are" : "is"));
51849ca828Sedward 			else if (!bulky)
52849ca828Sedward 				printf("The %s %s too cumbersome to hold.\n", objsht[value],(objsht[value][n-1] == 's' ? "are" : "is"));
53849ca828Sedward 			else
54849ca828Sedward 				printf("I dont see any %s around here.\n", objsht[value]);
55849ca828Sedward 			if (wordnumber < wordcount -1 && wordvalue[++wordnumber] == AND)
56849ca828Sedward 				wordnumber++;
57849ca828Sedward 			else
58849ca828Sedward 				return(firstnumber);
59849ca828Sedward 		}
60849ca828Sedward 	}
61849ca828Sedward 			    /* special cases with their own return()'s */
62849ca828Sedward 
63849ca828Sedward 	if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS)
64849ca828Sedward 		switch(wordvalue[wordnumber]){
65849ca828Sedward 
66849ca828Sedward 			case SWORD:
67849ca828Sedward 				if (testbit(from, SWORD)){
68849ca828Sedward 					wordtype[wordnumber--] = OBJECT;
69849ca828Sedward 					return(take(from));
70849ca828Sedward 				}
71849ca828Sedward 				if (testbit(from, TWO_HANDED)){
72849ca828Sedward 					wordvalue[wordnumber] = TWO_HANDED;
73849ca828Sedward 					wordtype[wordnumber--] = OBJECT;
74849ca828Sedward 					return(take(from));
75849ca828Sedward 				}
76849ca828Sedward 				wordvalue[wordnumber] = BROAD;
77849ca828Sedward 				wordtype[wordnumber--] = OBJECT;
78849ca828Sedward 				return(take(from));
79849ca828Sedward 
80849ca828Sedward 			case BODY:
81849ca828Sedward 				if (testbit(from,MAID)){
82849ca828Sedward 					wordvalue[wordnumber] = MAID;
83849ca828Sedward 					wordtype[wordnumber--] = OBJECT;
84849ca828Sedward 					return(take(from));
85849ca828Sedward 				}
86849ca828Sedward 				else if (testbit(from,DEADWOOD)){
87849ca828Sedward 					wordvalue[wordnumber] = DEADWOOD;
88849ca828Sedward 					wordtype[wordnumber--] = OBJECT;
89849ca828Sedward 					return(take(from));
90849ca828Sedward 				}
91849ca828Sedward 				else if (testbit(from,DEADNATIVE)){
92849ca828Sedward 					wordvalue[wordnumber] = DEADNATIVE;
93849ca828Sedward 					wordtype[wordnumber--] = OBJECT;
94849ca828Sedward 					return(take(from));
95849ca828Sedward 				}
96849ca828Sedward 				else if (testbit(from,DEADGOD)){
97849ca828Sedward 					wordvalue[wordnumber] = DEADGOD;
98849ca828Sedward 					wordtype[wordnumber--] = OBJECT;
99849ca828Sedward 					return(take(from));
100849ca828Sedward 				}
101849ca828Sedward 				else {
102849ca828Sedward 					wordvalue[wordnumber] = DEADTIME;
103849ca828Sedward 					wordtype[wordnumber--] = OBJECT;
104849ca828Sedward 					return(take(from));
105849ca828Sedward 				}
106849ca828Sedward 				break;
107849ca828Sedward 
108849ca828Sedward 			case AMULET:
109849ca828Sedward 				if (testbit(location[position].objects,AMULET)){
1107f30157aSedward 					puts("The amulet is warm to the touch, and its beauty catches your breath.");
1117f30157aSedward 					puts("A mist falls over your eyes, but then it is gone.  Sounds seem clearer");
112849ca828Sedward 					puts("and sharper but far away as if in a dream.  The sound of purling water reaches");
1137f30157aSedward 					puts("you from afar.  The mist falls again, and your heart leaps in horror.  The gold");
114849ca828Sedward 					puts("freezes your hands and fathomless darkness engulfs your soul.");
115849ca828Sedward 				}
116849ca828Sedward 				wordtype[wordnumber--] = OBJECT;
117849ca828Sedward 				return(take(from));
118849ca828Sedward 
119849ca828Sedward 			case MEDALION:
120849ca828Sedward 				if (testbit(location[position].objects, MEDALION)){
1217f30157aSedward 					puts("The medallion is warm, and it rekindles your spirit with the warmth of life.");
122849ca828Sedward 					puts("Your amulet begins to glow as the medallion is brought near to it, and together\nthey radiate.");
123849ca828Sedward 				}
124849ca828Sedward 				wordtype[wordnumber--] = OBJECT;
125849ca828Sedward 				return(take(from));
126849ca828Sedward 
127849ca828Sedward 			case TALISMAN:
128849ca828Sedward 				if (testbit(location[position].objects,TALISMAN)){
1297f30157aSedward 					puts("The talisman is cold to the touch, and it sends a chill down your spine.");
130849ca828Sedward 				}
131849ca828Sedward 				wordtype[wordnumber--] = OBJECT;
132849ca828Sedward 				return(take(from));
133849ca828Sedward 
134849ca828Sedward 			case NORMGOD:
135849ca828Sedward 				if (testbit(location[position].objects,BATHGOD) && (testbit(wear,AMULET) || testbit(inven,AMULET))){
1367f30157aSedward 					puts("She offers a delicate hand, and you help her out of the sparkling springs.");
137849ca828Sedward 					puts("Water droplets like liquid silver bedew her golden skin, but when they part");
138849ca828Sedward 					puts("from her, they fall as teardrops.  She wraps a single cloth around her and");
139849ca828Sedward 					puts("ties it at the waist.  Around her neck hangs a golden amulet.");
140849ca828Sedward 					puts("She bids you to follow her.");
141849ca828Sedward 					pleasure++;
142849ca828Sedward 					followgod = time;
143849ca828Sedward 					clearbit(location[position].objects,BATHGOD);
144849ca828Sedward 				} else if (!testbit(location[position].objects,BATHGOD))
145849ca828Sedward 					puts("You're in no position to take her.");
146849ca828Sedward 				else
147849ca828Sedward 					puts("She moves away from you.");
148849ca828Sedward 				break;
149849ca828Sedward 
150849ca828Sedward 			default:
151849ca828Sedward 				puts("It doesn't seem to work.");
152849ca828Sedward 		}
153849ca828Sedward 	else
154849ca828Sedward 		puts("You've got to be kidding.");
155849ca828Sedward 	return(firstnumber);
156849ca828Sedward }
157849ca828Sedward 
throw(name)1587f30157aSedward throw(name)
1597f30157aSedward 	char *name;
160849ca828Sedward {
161849ca828Sedward 	int n;
162849ca828Sedward 	int deposit = 0;
163849ca828Sedward 	int first, value;
164849ca828Sedward 
165849ca828Sedward 	first = wordnumber;
1667f30157aSedward 	if (drop(name) != -1){
167849ca828Sedward 		switch(wordvalue[wordnumber]){
168849ca828Sedward 
169849ca828Sedward 			case AHEAD:
170849ca828Sedward 				deposit = ahead;
171849ca828Sedward 				break;
172849ca828Sedward 
173849ca828Sedward 			case BACK:
174849ca828Sedward 				deposit = back;
175849ca828Sedward 				break;
176849ca828Sedward 
177849ca828Sedward 			case LEFT:
178849ca828Sedward 				deposit = left;
179849ca828Sedward 				break;
180849ca828Sedward 
181849ca828Sedward 			case RIGHT:
182849ca828Sedward 				deposit = right;
183849ca828Sedward 				break;
184849ca828Sedward 
185849ca828Sedward 			case UP:
186849ca828Sedward 				deposit = location[position].up * (location[position].access || position == FINAL);
187849ca828Sedward 				break;
188849ca828Sedward 
189849ca828Sedward 			case DOWN:
190849ca828Sedward 				deposit = location[position].down;
191849ca828Sedward 				break;
192849ca828Sedward 		}
193849ca828Sedward 		wordnumber = first;
194849ca828Sedward 		while (wordtype[++wordnumber] == ADJS);
195849ca828Sedward 		while (wordnumber <= wordcount){
196849ca828Sedward 			value = wordvalue[wordnumber];
197849ca828Sedward 			if (deposit && testbit(location[position].objects,value)){
198849ca828Sedward 				clearbit(location[position].objects,value);
199849ca828Sedward 				if (value != GRENADE)
200849ca828Sedward 					setbit(location[deposit].objects,value);
201849ca828Sedward 				else{
202849ca828Sedward 					puts("A thundering explosion nearby sends up a cloud of smoke and shrapnel.");
203849ca828Sedward 					for (n = 0; n < NUMOFWORDS; n ++)
204849ca828Sedward 						location[deposit].objects[n] = 0;
205849ca828Sedward 					setbit(location[deposit].objects,CHAR);
206849ca828Sedward 				}
207849ca828Sedward 				if (value == ROPE && position == FINAL)
208849ca828Sedward 					location[position].access = 1;
209849ca828Sedward 				switch(deposit){
210849ca828Sedward 					case 189:
211849ca828Sedward 					case 231:
212849ca828Sedward 						puts("The stone door is unhinged.");
213849ca828Sedward 						location[189].north = 231;
214849ca828Sedward 						location[231].south = 189;
215849ca828Sedward 						break;
216849ca828Sedward 					case 30:
217849ca828Sedward 						puts("The wooden door is blown open.");
218849ca828Sedward 						location[30].west = 25;
219849ca828Sedward 						break;
220849ca828Sedward 					case 31:
221849ca828Sedward 						puts("The door is not damaged.");
222849ca828Sedward 				}
223849ca828Sedward 			}
224849ca828Sedward 			else if (value == GRENADE && testbit(location[position].objects,value)){
225849ca828Sedward 				puts("You are blown into shreds when your grenade explodes.");
226849ca828Sedward 				die();
227849ca828Sedward 			}
228849ca828Sedward 			if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
229849ca828Sedward 				wordnumber++;
230849ca828Sedward 			else
231849ca828Sedward 				return(first);
232849ca828Sedward 		}
233849ca828Sedward 		return(first);
234849ca828Sedward 	}
235849ca828Sedward 	return(first);
236849ca828Sedward }
237849ca828Sedward 
drop(name)238849ca828Sedward drop(name)
239849ca828Sedward char *name;
240849ca828Sedward {
241849ca828Sedward 
242849ca828Sedward 	int firstnumber, value;
243849ca828Sedward 
244849ca828Sedward 	firstnumber = wordnumber;
2457f30157aSedward 	while (wordtype[++wordnumber] == ADJS)
2467f30157aSedward 		;
247849ca828Sedward 	while (wordnumber<=wordcount && (wordtype[wordnumber] == OBJECT || wordtype[wordnumber] == NOUNS)) {
248849ca828Sedward 		value = wordvalue[wordnumber];
249849ca828Sedward 		printf("%s:\n", objsht[value]);
250849ca828Sedward 		if (testbit(inven,value)){
251849ca828Sedward 			clearbit(inven,value);
252849ca828Sedward 			carrying -= objwt[value];
253849ca828Sedward 			encumber -= objcumber[value];
254849ca828Sedward 			if (value == BOMB){
255849ca828Sedward 				puts("The bomb explodes.  A blinding white light and immense concussion obliterate us.");
256849ca828Sedward 				die();
257849ca828Sedward 			}
258849ca828Sedward 			if (value != AMULET && value != MEDALION && value != TALISMAN)
259849ca828Sedward 				setbit(location[position].objects,value);
260849ca828Sedward 			else
261849ca828Sedward 				tempwiz = 0;
262849ca828Sedward 			time++;
2637f30157aSedward 			if (*name == 'K')
2647f30157aSedward 				puts("Drop kicked.");
2657f30157aSedward 			else
266849ca828Sedward 				printf("%s.\n", name);
267849ca828Sedward 		}
268849ca828Sedward 		else {
2697f30157aSedward 			if (*name != 'K') {
270849ca828Sedward 				printf("You aren't holding the %s.\n", objsht[value]);
271849ca828Sedward 				if (testbit(location[position].objects,value)) {
272849ca828Sedward 					if (*name == 'T')
273849ca828Sedward 						puts("Kicked instead.");
2747f30157aSedward 					else if (*name == 'G')
275849ca828Sedward 						puts("Given anyway.");
276849ca828Sedward 				}
2777f30157aSedward 			} else
2787f30157aSedward 				puts("Kicked.");
279849ca828Sedward 		}
280849ca828Sedward 		if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
281849ca828Sedward 			wordnumber++;
282849ca828Sedward 		else
283849ca828Sedward 			return(firstnumber);
284849ca828Sedward 	}
285849ca828Sedward 	puts("Do what?");
286849ca828Sedward 	return(-1);
287849ca828Sedward }
288849ca828Sedward 
takeoff()289849ca828Sedward takeoff()
290849ca828Sedward {
291849ca828Sedward 	wordnumber = take(wear);
292849ca828Sedward 	return(drop("Dropped"));
293849ca828Sedward }
294849ca828Sedward 
puton()295849ca828Sedward puton()
296849ca828Sedward {
297849ca828Sedward 	wordnumber = take(location[position].objects);
298849ca828Sedward 	return(wearit());
299849ca828Sedward }
300849ca828Sedward 
eat()301849ca828Sedward eat()
302849ca828Sedward {
303849ca828Sedward 	int firstnumber, value;
304849ca828Sedward 
305849ca828Sedward 	firstnumber = wordnumber;
306849ca828Sedward 	while(wordtype[++wordnumber] == ADJS);
307849ca828Sedward 	while(wordnumber <= wordcount){
308849ca828Sedward 		value = wordvalue[wordnumber];
309849ca828Sedward 		switch(value){
310849ca828Sedward 
311849ca828Sedward 			case -1:
312849ca828Sedward 				puts("Eat what?");
313849ca828Sedward 				return(firstnumber);
314849ca828Sedward 
315849ca828Sedward 			default:
31643ded9bfSedward 				printf("You can't eat%s%s!\n",
31743ded9bfSedward 					wordtype[wordnumber] == OBJECT &&
31843ded9bfSedward 					objsht[value]
31943ded9bfSedward 					[strlen(objsht[value]) - 1] == 's' ?
32043ded9bfSedward 					" " : " a ",
32143ded9bfSedward 					words[wordnumber]);
322849ca828Sedward 				return(firstnumber);
323849ca828Sedward 
324849ca828Sedward 			case PAPAYAS:
325849ca828Sedward 			case PINEAPPLE:
326849ca828Sedward 			case KIWI:
327849ca828Sedward 			case COCONUTS:	/* eatable things */
328849ca828Sedward 			case MANGO:
329849ca828Sedward 
330849ca828Sedward 				printf("%s:\n",objsht[value]);
331849ca828Sedward 				if (testbit(inven,value) && time > ate - CYCLE && testbit(inven,KNIFE)){
332849ca828Sedward 					clearbit(inven,value);
333849ca828Sedward 					carrying -= objwt[value];
334849ca828Sedward 					encumber -= objcumber[value];
335849ca828Sedward 					ate = max(time,ate) + CYCLE/3;
336849ca828Sedward 					snooze += CYCLE/10;
337849ca828Sedward 					time++;
3387f30157aSedward 					puts("Eaten.  You can explore a little longer now.");
339849ca828Sedward 				}
340849ca828Sedward 				else if (time < ate - CYCLE)
3417f30157aSedward 					puts("You're stuffed.");
342849ca828Sedward 				else if (!testbit(inven,KNIFE))
343849ca828Sedward 					puts("You need a knife.");
344849ca828Sedward 				else
345849ca828Sedward 					printf("You aren't holding the %s.\n", objsht[value]);
346849ca828Sedward 				if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
347849ca828Sedward 					wordnumber++;
348849ca828Sedward 				else
349849ca828Sedward 					return(firstnumber);
350849ca828Sedward 		} /* end switch */
351849ca828Sedward 	} /* end while */
352849ca828Sedward 	return(firstnumber);
353849ca828Sedward }
354