1*4318c66eSSascha Wildner /* @(#)com4.c 8.2 (Berkeley) 4/28/95 */
2*4318c66eSSascha Wildner /* $NetBSD: command4.c,v 1.3 2005/07/01 06:04:54 jmc Exp $ */
3*4318c66eSSascha Wildner
4*4318c66eSSascha Wildner /*
5937f07e0SSascha Wildner * Copyright (c) 1983, 1993
6937f07e0SSascha Wildner * The Regents of the University of California. All rights reserved.
7937f07e0SSascha Wildner *
8937f07e0SSascha Wildner * Redistribution and use in source and binary forms, with or without
9937f07e0SSascha Wildner * modification, are permitted provided that the following conditions
10937f07e0SSascha Wildner * are met:
11937f07e0SSascha Wildner * 1. Redistributions of source code must retain the above copyright
12937f07e0SSascha Wildner * notice, this list of conditions and the following disclaimer.
13937f07e0SSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright
14937f07e0SSascha Wildner * notice, this list of conditions and the following disclaimer in the
15937f07e0SSascha Wildner * documentation and/or other materials provided with the distribution.
16937f07e0SSascha Wildner * 3. Neither the name of the University nor the names of its contributors
17937f07e0SSascha Wildner * may be used to endorse or promote products derived from this software
18937f07e0SSascha Wildner * without specific prior written permission.
19937f07e0SSascha Wildner *
20937f07e0SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21937f07e0SSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22937f07e0SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23937f07e0SSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24937f07e0SSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25937f07e0SSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26937f07e0SSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27937f07e0SSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28937f07e0SSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29937f07e0SSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30937f07e0SSascha Wildner * SUCH DAMAGE.
31937f07e0SSascha Wildner */
32937f07e0SSascha Wildner
33*4318c66eSSascha Wildner #include "extern.h"
34937f07e0SSascha Wildner
35937f07e0SSascha Wildner int
take(unsigned int from[])36937f07e0SSascha Wildner take(unsigned int from[])
37937f07e0SSascha Wildner {
38937f07e0SSascha Wildner int firstnumber, heavy, bulky, value;
39937f07e0SSascha Wildner
40937f07e0SSascha Wildner firstnumber = wordnumber;
41937f07e0SSascha Wildner if (wordnumber < wordcount && wordvalue[wordnumber + 1] == OFF) {
42937f07e0SSascha Wildner wordnumber++;
43937f07e0SSascha Wildner wordvalue[wordnumber] = TAKEOFF;
44*4318c66eSSascha Wildner wordtype[wordnumber] = VERB;
45937f07e0SSascha Wildner return (cypher());
46937f07e0SSascha Wildner } else {
47*4318c66eSSascha Wildner wordnumber++;
48937f07e0SSascha Wildner while (wordnumber <= wordcount && wordtype[wordnumber] ==
49937f07e0SSascha Wildner OBJECT) {
50937f07e0SSascha Wildner value = wordvalue[wordnumber];
51937f07e0SSascha Wildner printf("%s:\n", objsht[value]);
52937f07e0SSascha Wildner heavy = (carrying + objwt[value]) <= WEIGHT;
53937f07e0SSascha Wildner bulky = (encumber + objcumber[value]) <= CUMBER;
54937f07e0SSascha Wildner if ((testbit(from, value) || wiz || tempwiz) &&
55937f07e0SSascha Wildner heavy && bulky && !testbit(inven, value)) {
56937f07e0SSascha Wildner setbit(inven, value);
57937f07e0SSascha Wildner carrying += objwt[value];
58937f07e0SSascha Wildner encumber += objcumber[value];
59*4318c66eSSascha Wildner ourtime++;
60937f07e0SSascha Wildner if (testbit(from, value))
61937f07e0SSascha Wildner printf("Taken.\n");
62937f07e0SSascha Wildner else
63937f07e0SSascha Wildner printf("Zap! Taken from thin air.\n");
64937f07e0SSascha Wildner clearbit(from, value);
65937f07e0SSascha Wildner if (value == MEDALION)
66*4318c66eSSascha Wildner win--;
67937f07e0SSascha Wildner } else if (testbit(inven, value))
68937f07e0SSascha Wildner printf("You're already holding %s%s.\n",
69*4318c66eSSascha Wildner A_OR_AN_OR_BLANK(value),
70*4318c66eSSascha Wildner objsht[value]);
71*4318c66eSSascha Wildner else if (!testbit(from, value))
72*4318c66eSSascha Wildner printf("I don't see any %s around here.\n",
73937f07e0SSascha Wildner objsht[value]);
74937f07e0SSascha Wildner else if (!heavy)
75937f07e0SSascha Wildner printf("The %s %stoo heavy.\n", objsht[value],
76*4318c66eSSascha Wildner IS_OR_ARE(value));
77937f07e0SSascha Wildner else
78*4318c66eSSascha Wildner printf("The %s %stoo cumbersome to hold.\n",
79*4318c66eSSascha Wildner objsht[value], IS_OR_ARE(value));
80937f07e0SSascha Wildner if (wordnumber < wordcount - 1 &&
81937f07e0SSascha Wildner wordvalue[++wordnumber] == AND)
82937f07e0SSascha Wildner wordnumber++;
83937f07e0SSascha Wildner else
84937f07e0SSascha Wildner return (firstnumber);
85937f07e0SSascha Wildner }
86937f07e0SSascha Wildner }
87937f07e0SSascha Wildner /* special cases with their own return()'s */
88*4318c66eSSascha Wildner
89937f07e0SSascha Wildner if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS)
90937f07e0SSascha Wildner switch (wordvalue[wordnumber]) {
91*4318c66eSSascha Wildner
92937f07e0SSascha Wildner case SWORD:
93937f07e0SSascha Wildner if (testbit(from, SWORD)) {
94937f07e0SSascha Wildner wordtype[wordnumber--] = OBJECT;
95937f07e0SSascha Wildner return (take(from));
96937f07e0SSascha Wildner }
97937f07e0SSascha Wildner if (testbit(from, TWO_HANDED)) {
98937f07e0SSascha Wildner wordvalue[wordnumber] = TWO_HANDED;
99937f07e0SSascha Wildner wordtype[wordnumber--] = OBJECT;
100937f07e0SSascha Wildner return (take(from));
101937f07e0SSascha Wildner }
102937f07e0SSascha Wildner wordvalue[wordnumber] = BROAD;
103937f07e0SSascha Wildner wordtype[wordnumber--] = OBJECT;
104937f07e0SSascha Wildner return (take(from));
105937f07e0SSascha Wildner
106937f07e0SSascha Wildner case BODY:
107937f07e0SSascha Wildner if (testbit(from, MAID)) {
108937f07e0SSascha Wildner wordvalue[wordnumber] = MAID;
109937f07e0SSascha Wildner wordtype[wordnumber--] = OBJECT;
110937f07e0SSascha Wildner return (take(from));
111937f07e0SSascha Wildner } else if (testbit(from, DEADWOOD)) {
112937f07e0SSascha Wildner wordvalue[wordnumber] = DEADWOOD;
113937f07e0SSascha Wildner wordtype[wordnumber--] = OBJECT;
114937f07e0SSascha Wildner return (take(from));
115937f07e0SSascha Wildner } else if (testbit(from, DEADNATIVE)) {
116937f07e0SSascha Wildner wordvalue[wordnumber] = DEADNATIVE;
117937f07e0SSascha Wildner wordtype[wordnumber--] = OBJECT;
118937f07e0SSascha Wildner return (take(from));
119937f07e0SSascha Wildner } else {
120937f07e0SSascha Wildner if (testbit(from, DEADGOD)) {
121937f07e0SSascha Wildner wordvalue[wordnumber] = DEADGOD;
122937f07e0SSascha Wildner wordtype[wordnumber--] = OBJECT;
123937f07e0SSascha Wildner return (take(from));
124937f07e0SSascha Wildner } else {
125937f07e0SSascha Wildner wordvalue[wordnumber] = DEADTIME;
126937f07e0SSascha Wildner wordtype[wordnumber--] = OBJECT;
127937f07e0SSascha Wildner return (take(from));
128937f07e0SSascha Wildner }
129937f07e0SSascha Wildner }
130937f07e0SSascha Wildner break;
131937f07e0SSascha Wildner
132937f07e0SSascha Wildner case AMULET:
133937f07e0SSascha Wildner if (testbit(location[position].objects, AMULET)) {
134*4318c66eSSascha Wildner printf("The amulet is warm to the touch, and ");
135*4318c66eSSascha Wildner puts("its beauty catches your breath.");
136*4318c66eSSascha Wildner printf("A mist falls over your eyes, but ");
137*4318c66eSSascha Wildner puts("then it is gone. Sounds seem clearer");
138*4318c66eSSascha Wildner printf("and sharper but far away as if in a ");
139*4318c66eSSascha Wildner puts("dream. The sound of purling water");
140*4318c66eSSascha Wildner printf("reaches you from afar. The mist ");
141*4318c66eSSascha Wildner printf("falls again, and your heart leaps in ");
142*4318c66eSSascha Wildner puts("horror.");
143*4318c66eSSascha Wildner printf("The gold freezes your hands and ");
144*4318c66eSSascha Wildner puts("fathomless darkness engulfs your soul.");
145937f07e0SSascha Wildner }
146937f07e0SSascha Wildner wordtype[wordnumber--] = OBJECT;
147937f07e0SSascha Wildner return (take(from));
148937f07e0SSascha Wildner
149937f07e0SSascha Wildner case MEDALION:
150937f07e0SSascha Wildner if (testbit(location[position].objects, MEDALION)) {
151*4318c66eSSascha Wildner printf("The medallion is warm, and it ");
152*4318c66eSSascha Wildner printf("rekindles your spirit with the ");
153*4318c66eSSascha Wildner puts("warmth of life.");
154*4318c66eSSascha Wildner printf("Your amulet begins to glow as the ");
155*4318c66eSSascha Wildner printf("medallion is brought near to it, ");
156*4318c66eSSascha Wildner printf("and together\nthey radiate.\n");
157937f07e0SSascha Wildner }
158937f07e0SSascha Wildner wordtype[wordnumber--] = OBJECT;
159937f07e0SSascha Wildner return (take(from));
160937f07e0SSascha Wildner
161937f07e0SSascha Wildner case TALISMAN:
162*4318c66eSSascha Wildner if (testbit(location[position].objects, TALISMAN)) {
163*4318c66eSSascha Wildner printf("The talisman is cold to the touch, ");
164*4318c66eSSascha Wildner puts("and it sends a chill down your spine.");
165*4318c66eSSascha Wildner }
166937f07e0SSascha Wildner wordtype[wordnumber--] = OBJECT;
167937f07e0SSascha Wildner return (take(from));
168937f07e0SSascha Wildner
169937f07e0SSascha Wildner case NORMGOD:
170937f07e0SSascha Wildner if (testbit(location[position].objects, BATHGOD) &&
171937f07e0SSascha Wildner (testbit(wear, AMULET) || testbit(inven, AMULET))) {
172*4318c66eSSascha Wildner printf("She offers a delicate hand, and you ");
173*4318c66eSSascha Wildner puts("help her out of the sparkling springs.");
174*4318c66eSSascha Wildner printf("Water droplets like liquid silver ");
175*4318c66eSSascha Wildner printf("bedew her golden skin, but when ");
176*4318c66eSSascha Wildner puts("they part");
177*4318c66eSSascha Wildner printf("from her, they fall as teardrops. ");
178*4318c66eSSascha Wildner puts("She wraps a single cloth around her and");
179*4318c66eSSascha Wildner printf("ties it at the waist. Around her ");
180*4318c66eSSascha Wildner puts("neck hangs a golden amulet.");
181*4318c66eSSascha Wildner printf("She bids you to follow her, and ");
182*4318c66eSSascha Wildner puts("walks away.");
183937f07e0SSascha Wildner pleasure++;
184*4318c66eSSascha Wildner followgod = ourtime;
185937f07e0SSascha Wildner clearbit(location[position].objects, BATHGOD);
186937f07e0SSascha Wildner } else
187*4318c66eSSascha Wildner if (!testbit(location[position].objects,
188*4318c66eSSascha Wildner BATHGOD)) {
189*4318c66eSSascha Wildner printf("You're in no position to ");
190*4318c66eSSascha Wildner puts("take her.");
191*4318c66eSSascha Wildner } else
192937f07e0SSascha Wildner puts("She moves away from you.");
193937f07e0SSascha Wildner break;
194937f07e0SSascha Wildner
195937f07e0SSascha Wildner default:
196937f07e0SSascha Wildner puts("It doesn't seem to work.");
197937f07e0SSascha Wildner }
198937f07e0SSascha Wildner else
199937f07e0SSascha Wildner puts("You've got to be kidding.");
200937f07e0SSascha Wildner return (firstnumber);
201937f07e0SSascha Wildner }
202937f07e0SSascha Wildner
203937f07e0SSascha Wildner int
throw(const char * name)204937f07e0SSascha Wildner throw(const char *name)
205937f07e0SSascha Wildner {
206*4318c66eSSascha Wildner unsigned int n;
207*4318c66eSSascha Wildner int deposit = 0;
208937f07e0SSascha Wildner int first, value;
209937f07e0SSascha Wildner
210937f07e0SSascha Wildner first = wordnumber;
211937f07e0SSascha Wildner if (drop(name) != -1) {
212937f07e0SSascha Wildner switch (wordvalue[wordnumber]) {
213*4318c66eSSascha Wildner
214937f07e0SSascha Wildner case AHEAD:
215937f07e0SSascha Wildner deposit = ahead;
216937f07e0SSascha Wildner break;
217937f07e0SSascha Wildner
218937f07e0SSascha Wildner case BACK:
219937f07e0SSascha Wildner deposit = back;
220937f07e0SSascha Wildner break;
221937f07e0SSascha Wildner
222937f07e0SSascha Wildner case LEFT:
223937f07e0SSascha Wildner deposit = left;
224937f07e0SSascha Wildner break;
225937f07e0SSascha Wildner
226937f07e0SSascha Wildner case RIGHT:
227937f07e0SSascha Wildner deposit = right;
228937f07e0SSascha Wildner break;
229937f07e0SSascha Wildner
230937f07e0SSascha Wildner case UP:
231937f07e0SSascha Wildner deposit = location[position].up *
232937f07e0SSascha Wildner (location[position].access || position == FINAL);
233937f07e0SSascha Wildner break;
234937f07e0SSascha Wildner
235937f07e0SSascha Wildner case DOWN:
236937f07e0SSascha Wildner deposit = location[position].down;
237937f07e0SSascha Wildner break;
238937f07e0SSascha Wildner }
239*4318c66eSSascha Wildner wordnumber = first + 1;
240937f07e0SSascha Wildner while (wordnumber <= wordcount) {
241937f07e0SSascha Wildner value = wordvalue[wordnumber];
242937f07e0SSascha Wildner if (deposit &&
243937f07e0SSascha Wildner testbit(location[position].objects, value)) {
244937f07e0SSascha Wildner clearbit(location[position].objects, value);
245937f07e0SSascha Wildner if (value != GRENADE)
246*4318c66eSSascha Wildner setbit(location[deposit].objects,
247*4318c66eSSascha Wildner value);
248937f07e0SSascha Wildner else {
249*4318c66eSSascha Wildner printf("A thundering explosion ");
250*4318c66eSSascha Wildner printf("nearby sends up a cloud of ");
251*4318c66eSSascha Wildner puts("smoke and shrapnel.");
252937f07e0SSascha Wildner for (n = 0; n < NUMOFWORDS; n++)
253*4318c66eSSascha Wildner location[deposit].objects[n] =
254*4318c66eSSascha Wildner 0;
255937f07e0SSascha Wildner setbit(location[deposit].objects, CHAR);
256937f07e0SSascha Wildner }
257937f07e0SSascha Wildner if (value == ROPE && position == FINAL)
258937f07e0SSascha Wildner location[position].access = 1;
259937f07e0SSascha Wildner switch (deposit) {
260937f07e0SSascha Wildner case 189:
261937f07e0SSascha Wildner case 231:
262937f07e0SSascha Wildner puts("The stone door is unhinged.");
263937f07e0SSascha Wildner location[189].north = 231;
264937f07e0SSascha Wildner location[231].south = 189;
265937f07e0SSascha Wildner break;
266937f07e0SSascha Wildner case 30:
267937f07e0SSascha Wildner puts("The wooden door is blown open.");
268937f07e0SSascha Wildner location[30].west = 25;
269937f07e0SSascha Wildner break;
270937f07e0SSascha Wildner case 31:
271937f07e0SSascha Wildner puts("The door is not damaged.");
272937f07e0SSascha Wildner }
273937f07e0SSascha Wildner } else
274937f07e0SSascha Wildner if (value == GRENADE &&
275*4318c66eSSascha Wildner testbit(location[position].objects,
276*4318c66eSSascha Wildner value)) {
277*4318c66eSSascha Wildner printf("You are blown into shreds ");
278*4318c66eSSascha Wildner puts("when your grenade explodes.");
279*4318c66eSSascha Wildner die();
280937f07e0SSascha Wildner }
281937f07e0SSascha Wildner if (wordnumber < wordcount - 1 &&
282937f07e0SSascha Wildner wordvalue[++wordnumber] == AND)
283937f07e0SSascha Wildner wordnumber++;
284937f07e0SSascha Wildner else
285937f07e0SSascha Wildner return (first);
286937f07e0SSascha Wildner }
287937f07e0SSascha Wildner return (first);
288937f07e0SSascha Wildner }
289937f07e0SSascha Wildner return (first);
290937f07e0SSascha Wildner }
291937f07e0SSascha Wildner
292937f07e0SSascha Wildner int
drop(const char * name)293937f07e0SSascha Wildner drop(const char *name)
294937f07e0SSascha Wildner {
295*4318c66eSSascha Wildner
296937f07e0SSascha Wildner int firstnumber, value;
297937f07e0SSascha Wildner
298937f07e0SSascha Wildner firstnumber = wordnumber;
299*4318c66eSSascha Wildner wordnumber++;
300937f07e0SSascha Wildner while (wordnumber <= wordcount &&
301937f07e0SSascha Wildner (wordtype[wordnumber] == OBJECT || wordtype[wordnumber] == NOUNS)) {
302937f07e0SSascha Wildner value = wordvalue[wordnumber];
303*4318c66eSSascha Wildner if (value == BODY) { /* special case */
304*4318c66eSSascha Wildner wordtype[wordnumber] = OBJECT;
305*4318c66eSSascha Wildner if (testbit(inven, MAID) ||
306*4318c66eSSascha Wildner testbit(location[position].objects, MAID))
307*4318c66eSSascha Wildner value = MAID;
308*4318c66eSSascha Wildner else if (testbit(inven, DEADWOOD) ||
309*4318c66eSSascha Wildner testbit(location[position].objects, DEADWOOD))
310*4318c66eSSascha Wildner value = DEADWOOD;
311*4318c66eSSascha Wildner else if (testbit(inven, DEADGOD) ||
312*4318c66eSSascha Wildner testbit(location[position].objects, DEADGOD))
313*4318c66eSSascha Wildner value = DEADGOD;
314*4318c66eSSascha Wildner else if (testbit(inven, DEADTIME) ||
315*4318c66eSSascha Wildner testbit(location[position].objects, DEADTIME))
316*4318c66eSSascha Wildner value = DEADTIME;
317*4318c66eSSascha Wildner else if (testbit(inven, DEADNATIVE) ||
318*4318c66eSSascha Wildner testbit(location[position].objects, DEADNATIVE))
319*4318c66eSSascha Wildner value = DEADNATIVE;
320*4318c66eSSascha Wildner }
321*4318c66eSSascha Wildner if (wordtype[wordnumber] == NOUNS && value == DOOR) {
322*4318c66eSSascha Wildner if (*name == 'K')
323*4318c66eSSascha Wildner puts("You hurt your foot.");
324*4318c66eSSascha Wildner else
325*4318c66eSSascha Wildner puts("You're not holding a door.");
326*4318c66eSSascha Wildner } else if (objsht[value] == NULL) {
327*4318c66eSSascha Wildner if (*name == 'K')
328*4318c66eSSascha Wildner puts("That's not for kicking!");
329*4318c66eSSascha Wildner else
330*4318c66eSSascha Wildner puts("You don't have that.");
331*4318c66eSSascha Wildner } else {
332937f07e0SSascha Wildner printf("%s:\n", objsht[value]);
333937f07e0SSascha Wildner if (testbit(inven, value)) {
334937f07e0SSascha Wildner clearbit(inven, value);
335937f07e0SSascha Wildner carrying -= objwt[value];
336937f07e0SSascha Wildner encumber -= objcumber[value];
337937f07e0SSascha Wildner if (value == BOMB) {
338*4318c66eSSascha Wildner printf("The bomb explodes. A ");
339*4318c66eSSascha Wildner printf("blinding white light and ");
340*4318c66eSSascha Wildner printf("immense concussion ");
341*4318c66eSSascha Wildner puts("obliterate us.");
342*4318c66eSSascha Wildner die();
343937f07e0SSascha Wildner }
344*4318c66eSSascha Wildner if (value != AMULET && value != MEDALION &&
345*4318c66eSSascha Wildner value != TALISMAN)
346*4318c66eSSascha Wildner setbit(location[position].objects,
347*4318c66eSSascha Wildner value);
348937f07e0SSascha Wildner else
349937f07e0SSascha Wildner tempwiz = 0;
350*4318c66eSSascha Wildner ourtime++;
351937f07e0SSascha Wildner if (*name == 'K')
352937f07e0SSascha Wildner puts("Drop kicked.");
353937f07e0SSascha Wildner else
354937f07e0SSascha Wildner printf("%s.\n", name);
355937f07e0SSascha Wildner } else {
356937f07e0SSascha Wildner if (*name != 'K') {
357937f07e0SSascha Wildner printf("You aren't holding the %s.\n",
358937f07e0SSascha Wildner objsht[value]);
359937f07e0SSascha Wildner if (testbit(location[position].objects,
360937f07e0SSascha Wildner value)) {
361937f07e0SSascha Wildner if (*name == 'T')
362937f07e0SSascha Wildner puts("Kicked instead.");
363937f07e0SSascha Wildner else if (*name == 'G')
364937f07e0SSascha Wildner puts("Given anyway.");
365937f07e0SSascha Wildner }
366*4318c66eSSascha Wildner } else if (testbit(location[position].objects,
367*4318c66eSSascha Wildner value))
368937f07e0SSascha Wildner puts("Kicked.");
369*4318c66eSSascha Wildner else if (testbit(wear, value))
370*4318c66eSSascha Wildner puts("Not while it's being worn.");
371*4318c66eSSascha Wildner else
372*4318c66eSSascha Wildner puts("Not found.");
373*4318c66eSSascha Wildner }
374937f07e0SSascha Wildner }
375937f07e0SSascha Wildner if (wordnumber < wordcount - 1 &&
376937f07e0SSascha Wildner wordvalue[++wordnumber] == AND)
377937f07e0SSascha Wildner wordnumber++;
378937f07e0SSascha Wildner else
379937f07e0SSascha Wildner return (firstnumber);
380937f07e0SSascha Wildner }
381937f07e0SSascha Wildner puts("Do what?");
382937f07e0SSascha Wildner return (-1);
383937f07e0SSascha Wildner }
384937f07e0SSascha Wildner
385937f07e0SSascha Wildner int
takeoff(void)386937f07e0SSascha Wildner takeoff(void)
387937f07e0SSascha Wildner {
388937f07e0SSascha Wildner wordnumber = take(wear);
389937f07e0SSascha Wildner return (drop("Dropped"));
390937f07e0SSascha Wildner }
391937f07e0SSascha Wildner
392937f07e0SSascha Wildner int
puton(void)393937f07e0SSascha Wildner puton(void)
394937f07e0SSascha Wildner {
395937f07e0SSascha Wildner wordnumber = take(location[position].objects);
396937f07e0SSascha Wildner return (wearit());
397937f07e0SSascha Wildner }
398937f07e0SSascha Wildner
399937f07e0SSascha Wildner int
eat(void)400937f07e0SSascha Wildner eat(void)
401937f07e0SSascha Wildner {
402937f07e0SSascha Wildner int firstnumber, value;
403937f07e0SSascha Wildner
404937f07e0SSascha Wildner firstnumber = wordnumber;
405*4318c66eSSascha Wildner wordnumber++;
406937f07e0SSascha Wildner while (wordnumber <= wordcount) {
407937f07e0SSascha Wildner value = wordvalue[wordnumber];
408*4318c66eSSascha Wildner if (wordtype[wordnumber] != OBJECT || objsht[value] == NULL)
409*4318c66eSSascha Wildner value = -2;
410937f07e0SSascha Wildner switch (value) {
411*4318c66eSSascha Wildner
412*4318c66eSSascha Wildner case -2:
413*4318c66eSSascha Wildner puts("You can't eat that!");
414*4318c66eSSascha Wildner return (firstnumber);
415*4318c66eSSascha Wildner
416937f07e0SSascha Wildner case -1:
417937f07e0SSascha Wildner puts("Eat what?");
418937f07e0SSascha Wildner return (firstnumber);
419937f07e0SSascha Wildner
420937f07e0SSascha Wildner default:
421937f07e0SSascha Wildner printf("You can't eat %s%s!\n",
422*4318c66eSSascha Wildner A_OR_AN_OR_BLANK(value), objsht[value]);
423937f07e0SSascha Wildner return (firstnumber);
424937f07e0SSascha Wildner
425937f07e0SSascha Wildner case PAPAYAS:
426937f07e0SSascha Wildner case PINEAPPLE:
427937f07e0SSascha Wildner case KIWI:
428937f07e0SSascha Wildner case COCONUTS: /* eatable things */
429937f07e0SSascha Wildner case MANGO:
430937f07e0SSascha Wildner
431937f07e0SSascha Wildner printf("%s:\n", objsht[value]);
432937f07e0SSascha Wildner if (testbit(inven, value) &&
433*4318c66eSSascha Wildner ourtime > ate - CYCLE &&
434937f07e0SSascha Wildner testbit(inven, KNIFE)) {
435937f07e0SSascha Wildner clearbit(inven, value);
436937f07e0SSascha Wildner carrying -= objwt[value];
437937f07e0SSascha Wildner encumber -= objcumber[value];
438*4318c66eSSascha Wildner ate = max(ourtime, ate) + CYCLE / 3;
439937f07e0SSascha Wildner snooze += CYCLE / 10;
440*4318c66eSSascha Wildner ourtime++;
441*4318c66eSSascha Wildner printf("Eaten. You can explore a little ");
442*4318c66eSSascha Wildner puts("longer now.");
443*4318c66eSSascha Wildner } else if (!testbit(inven, value)) {
444937f07e0SSascha Wildner printf("You aren't holding the %s.\n",
445937f07e0SSascha Wildner objsht[value]);
446*4318c66eSSascha Wildner } else if (!testbit(inven, KNIFE))
447*4318c66eSSascha Wildner puts("You need a knife.");
448*4318c66eSSascha Wildner else
449*4318c66eSSascha Wildner puts("You're stuffed.");
450937f07e0SSascha Wildner if (wordnumber < wordcount - 1 &&
451937f07e0SSascha Wildner wordvalue[++wordnumber] == AND)
452937f07e0SSascha Wildner wordnumber++;
453937f07e0SSascha Wildner else
454937f07e0SSascha Wildner return (firstnumber);
455937f07e0SSascha Wildner } /* end switch */
456937f07e0SSascha Wildner } /* end while */
457937f07e0SSascha Wildner return (firstnumber);
458937f07e0SSascha Wildner }
459