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