xref: /netbsd/games/adventure/subr.c (revision bf9ec67e)
1 /*	$NetBSD: subr.c,v 1.9 2000/07/03 03:57:39 matt Exp $	*/
2 
3 /*-
4  * Copyright (c) 1991, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * The game adventure was originally written in Fortran by Will Crowther
8  * and Don Woods.  It was later translated to C and enhanced by Jim
9  * Gillogly.  This code is derived from software contributed to Berkeley
10  * by Jim Gillogly at The Rand Corporation.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. All advertising materials mentioning features or use of this software
21  *    must display the following acknowledgement:
22  *	This product includes software developed by the University of
23  *	California, Berkeley and its contributors.
24  * 4. Neither the name of the University nor the names of its contributors
25  *    may be used to endorse or promote products derived from this software
26  *    without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38  * SUCH DAMAGE.
39  */
40 
41 #include <sys/cdefs.h>
42 #ifndef lint
43 #if 0
44 static char sccsid[] = "@(#)subr.c	8.1 (Berkeley) 5/31/93";
45 #else
46 __RCSID("$NetBSD: subr.c,v 1.9 2000/07/03 03:57:39 matt Exp $");
47 #endif
48 #endif				/* not lint */
49 
50 /*      Re-coding of advent in C: subroutines from main                 */
51 
52 #include <stdio.h>
53 #include <stdlib.h>
54 #include "hdr.h"
55 #include "extern.h"
56 
57 /*              Statement functions     */
58 int
59 toting(objj)
60 	int     objj;
61 {
62 	if (place[objj] == -1)
63 		return (TRUE);
64 	else
65 		return (FALSE);
66 }
67 
68 int
69 here(objj)
70 	int     objj;
71 {
72 	if (place[objj] == loc || toting(objj))
73 		return (TRUE);
74 	else
75 		return (FALSE);
76 }
77 
78 int
79 at(objj)
80 	int     objj;
81 {
82 	if (place[objj] == loc || fixed[objj] == loc)
83 		return (TRUE);
84 	else
85 		return (FALSE);
86 }
87 
88 int
89 liq2(pbotl)
90 	int     pbotl;
91 {
92 	return ((1 - pbotl) * water + (pbotl / 2) * (water + oil));
93 }
94 
95 int
96 liq()
97 {
98 	int     i;
99 	i = prop[bottle];
100 	if (i > -1 - i)
101 		return (liq2(i));
102 	else
103 		return (liq2(-1 - i));
104 }
105 
106 int
107 liqloc(locc)			/* may want to clean this one up a bit */
108 	int     locc;
109 {
110 	int     i, j, l;
111 	i = cond[locc] / 2;
112 	j = ((i * 2) % 8) - 5;
113 	l = cond[locc] / 4;
114 	l = l % 2;
115 	return (liq2(j * l + 1));
116 }
117 
118 int
119 bitset(l, n)
120 	int     l, n;
121 {
122 	if (cond[l] & setbit[n])
123 		return (TRUE);
124 	return (FALSE);
125 }
126 
127 int
128 forced(locc)
129 	int     locc;
130 {
131 	if (cond[locc] == 2)
132 		return (TRUE);
133 	return (FALSE);
134 }
135 
136 int
137 dark()
138 {
139 	if ((cond[loc] % 2) == 0 && (prop[lamp] == 0 || !here(lamp)))
140 		return (TRUE);
141 	return (FALSE);
142 }
143 
144 int
145 pct(n)
146 	int     n;
147 {
148 	if (ran(100) < n)
149 		return (TRUE);
150 	return (FALSE);
151 }
152 
153 
154 int
155 fdwarf()
156 {				/* 71 */
157 	int     i, j;
158 	struct travlist *kk;
159 
160 	if (newloc != loc && !forced(loc) && !bitset(loc, 3)) {
161 		for (i = 1; i <= 5; i++) {
162 			if (odloc[i] != newloc || !dseen[i])
163 				continue;
164 			newloc = loc;
165 			rspeak(2);
166 			break;
167 		}
168 	}
169 	loc = newloc;		/* 74 */
170 	if (loc == 0 || forced(loc) || bitset(newloc, 3))
171 		return (2000);
172 	if (dflag == 0) {
173 		if (loc >= 15)
174 			dflag = 1;
175 		return (2000);
176 	}
177 	if (dflag == 1) {	/* 6000 */
178 		if (loc < 15 || pct(95))
179 			return (2000);
180 		dflag = 2;
181 		for (i = 1; i <= 2; i++) {
182 			j = 1 + ran(5);
183 			if (pct(50) && saved == -1)
184 				dloc[j] = 0;	/* 6001 */
185 		}
186 		for (i = 1; i <= 5; i++) {
187 			if (dloc[i] == loc)
188 				dloc[i] = daltlc;
189 			odloc[i] = dloc[i];	/* 6002 */
190 		}
191 		rspeak(3);
192 		drop(axe, loc);
193 		return (2000);
194 	}
195 	dtotal = attack = stick = 0;	/* 6010 */
196 	for (i = 1; i <= 6; i++) {	/* loop to 6030 */
197 		if (dloc[i] == 0)
198 			continue;
199 		j = 1;
200 		for (kk = travel[dloc[i]]; kk != 0; kk = kk->next) {
201 			newloc = kk->tloc;
202 			if (newloc > 300 || newloc < 15 || newloc == odloc[i]
203 			    || (j > 1 && newloc == tk[j - 1]) || j >= 20
204 			    || newloc == dloc[i] || forced(newloc)
205 			    || (i == 6 && bitset(newloc, 3))
206 			    || kk->conditions == 100)
207 				continue;
208 			tk[j++] = newloc;
209 		}
210 		tk[j] = odloc[i];	/* 6016 */
211 		if (j >= 2)
212 			j--;
213 		j = 1 + ran(j);
214 		odloc[i] = dloc[i];
215 		dloc[i] = tk[j];
216 		dseen[i] = (dseen[i] && loc >= 15) || (dloc[i] == loc || odloc[i] == loc);
217 		if (!dseen[i])
218 			continue;	/* i.e. goto 6030 */
219 		dloc[i] = loc;
220 		if (i == 6) {	/* pirate's spotted him */
221 			if (loc == chloc || prop[chest] >= 0)
222 				continue;
223 			k = 0;
224 			for (j = 50; j <= maxtrs; j++) {	/* loop to 6020 */
225 				if (j == pyram && (loc == plac[pyram]
226 					|| loc == plac[emrald]))
227 					goto l6020;
228 				if (toting(j))
229 					goto l6022;
230 		l6020:		if (here(j))
231 					k = 1;
232 			}	/* 6020 */
233 			if (tally == tally2 + 1 && k == 0 && place[chest] == 0
234 			    && here(lamp) && prop[lamp] == 1)
235 				goto l6025;
236 			if (odloc[6] != dloc[6] && pct(20))
237 				rspeak(127);
238 			continue;	/* to 6030 */
239 	l6022:		rspeak(128);
240 			if (place[messag] == 0)
241 				move(chest, chloc);
242 			move(messag, chloc2);
243 			for (j = 50; j <= maxtrs; j++) {	/* loop to 6023 */
244 				if (j == pyram && (loc == plac[pyram]
245 					|| loc == plac[emrald]))
246 					continue;
247 				if (at(j) && fixed[j] == 0)
248 					carry(j, loc);
249 				if (toting(j))
250 					drop(j, chloc);
251 			}
252 	l6024:		dloc[6] = odloc[6] = chloc;
253 			dseen[6] = FALSE;
254 			continue;
255 	l6025:		rspeak(186);
256 			move(chest, chloc);
257 			move(messag, chloc2);
258 			goto l6024;
259 		}
260 		dtotal++;	/* 6027 */
261 		if (odloc[i] != dloc[i])
262 			continue;
263 		attack++;
264 		if (knfloc >= 0)
265 			knfloc = loc;
266 		if (ran(1000) < 95 * (dflag - 2))
267 			stick++;
268 	}			/* 6030 */
269 	if (dtotal == 0)
270 		return (2000);
271 	if (dtotal != 1) {
272 		printf("There are %d threatening little dwarves ", dtotal);
273 		printf("in the room with you.\n");
274 	} else
275 		rspeak(4);
276 	if (attack == 0)
277 		return (2000);
278 	if (dflag == 2)
279 		dflag = 3;
280 	if (saved != -1)
281 		dflag = 20;
282 	if (attack != 1) {
283 		printf("%d of them throw knives at you!\n", attack);
284 		k = 6;
285 l82:		if (stick <= 1) {	/* 82 */
286 			rspeak(k + stick);
287 			if (stick == 0)
288 				return (2000);
289 		} else
290 			printf("%d of them get you!\n", stick);	/* 83 */
291 		oldlc2 = loc;
292 		return (99);
293 	}
294 	rspeak(5);
295 	k = 52;
296 	goto l82;
297 }
298 
299 
300 int
301 march()
302 {				/* label 8              */
303 	int     ll1, ll2;
304 
305 	if ((tkk = travel[newloc = loc]) == 0)
306 		bug(26);
307 	if (k == null)
308 		return (2);
309 	if (k == cave) {	/* 40                   */
310 		if (loc < 8)
311 			rspeak(57);
312 		if (loc >= 8)
313 			rspeak(58);
314 		return (2);
315 	}
316 	if (k == look) {	/* 30                   */
317 		if (detail++ < 3)
318 			rspeak(15);
319 		wzdark = FALSE;
320 		abb[loc] = 0;
321 		return (2);
322 	}
323 	if (k == back) {	/* 20                   */
324 		switch (mback()) {
325 		case 2:
326 			return (2);
327 		case 9:
328 			goto l9;
329 		default:
330 			bug(100);
331 		}
332 	}
333 	oldlc2 = oldloc;
334 	oldloc = loc;
335 l9:
336 	for (; tkk != 0; tkk = tkk->next)
337 		if (tkk->tverb == 1 || tkk->tverb == k)
338 			break;
339 	if (tkk == 0) {
340 		badmove();
341 		return (2);
342 	}
343 l11:	ll1 = tkk->conditions;	/* 11                   */
344 	ll2 = tkk->tloc;
345 	newloc = ll1;		/* newloc=conditions    */
346 	k = newloc % 100;	/* k used for prob      */
347 	if (newloc <= 300) {
348 		if (newloc <= 100) {	/* 13                   */
349 			if (newloc != 0 && !pct(newloc))
350 				goto l12;	/* 14   */
351 	l16:		newloc = ll2;	/* newloc=location      */
352 			if (newloc <= 300)
353 				return (2);
354 			if (newloc <= 500)
355 				switch (specials()) {	/* to 30000           */
356 				case 2:
357 					return (2);
358 				case 12:
359 					goto l12;
360 				case 99:
361 					return (99);
362 				default:
363 					bug(101);
364 				}
365 			rspeak(newloc - 500);
366 			newloc = loc;
367 			return (2);
368 		}
369 		if (toting(k) || (newloc > 200 && at(k)))
370 			goto l16;
371 		goto l12;
372 	}
373 	if (prop[k] != (newloc / 100) - 3)
374 		goto l16;	/* newloc still conditions */
375 l12:				/* alternative to probability move      */
376 	for (; tkk != 0; tkk = tkk->next)
377 		if (tkk->tloc != ll2 || tkk->conditions != ll1)
378 			break;
379 	if (tkk == 0)
380 		bug(25);
381 	goto l11;
382 }
383 
384 
385 
386 int
387 mback()
388 {				/* 20                   */
389 	struct travlist *tk2, *j;
390 	int     ll;
391 	if (forced(k = oldloc))
392 		k = oldlc2;	/* k=location           */
393 	oldlc2 = oldloc;
394 	oldloc = loc;
395 	tk2 = 0;
396 	if (k == loc) {
397 		rspeak(91);
398 		return (2);
399 	}
400 	for (; tkk != 0; tkk = tkk->next) {	/* 21                   */
401 		ll = tkk->tloc;
402 		if (ll == k) {
403 			k = tkk->tverb;	/* k back to verb       */
404 			tkk = travel[loc];
405 			return (9);
406 		}
407 		if (ll <= 300) {
408 			j = travel[loc];
409 			if (forced(ll) && k == j->tloc)
410 				tk2 = tkk;
411 		}
412 	}
413 	tkk = tk2;		/* 23                   */
414 	if (tkk != 0) {
415 		k = tkk->tverb;
416 		tkk = travel[loc];
417 		return (9);
418 	}
419 	rspeak(140);
420 	return (2);
421 }
422 
423 
424 int
425 specials()
426 {				/* 30000                */
427 	switch (newloc -= 300) {
428 		case 1:		/* 30100                */
429 		newloc = 99 + 100 - loc;
430 		if (holdng == 0 || (holdng == 1 && toting(emrald)))
431 			return (2);
432 		newloc = loc;
433 		rspeak(117);
434 		return (2);
435 	case 2:		/* 30200                */
436 		drop(emrald, loc);
437 		return (12);
438 	case 3:		/* to 30300             */
439 		return (trbridge());
440 	default:
441 		bug(29);
442 	}
443 }
444 
445 
446 int
447 trbridge()
448 {				/* 30300                */
449 	if (prop[troll] == 1) {
450 		pspeak(troll, 1);
451 		prop[troll] = 0;
452 		move(troll2, 0);
453 		move(troll2 + 100, 0);
454 		move(troll, plac[troll]);
455 		move(troll + 100, fixd[troll]);
456 		juggle(chasm);
457 		newloc = loc;
458 		return (2);
459 	}
460 	newloc = plac[troll] + fixd[troll] - loc;	/* 30310                */
461 	if (prop[troll] == 0)
462 		prop[troll] = 1;
463 	if (!toting(bear))
464 		return (2);
465 	rspeak(162);
466 	prop[chasm] = 1;
467 	prop[troll] = 2;
468 	drop(bear, newloc);
469 	fixed[bear] = -1;
470 	prop[bear] = 3;
471 	if (prop[spices] < 0)
472 		tally2++;
473 	oldlc2 = newloc;
474 	return (99);
475 }
476 
477 
478 void
479 badmove()
480 {				/* 20                   */
481 	spk = 12;
482 	if (k >= 43 && k <= 50)
483 		spk = 9;
484 	if (k == 29 || k == 30)
485 		spk = 9;
486 	if (k == 7 || k == 36 || k == 37)
487 		spk = 10;
488 	if (k == 11 || k == 19)
489 		spk = 11;
490 	if (verb == find || verb == invent)
491 		spk = 59;
492 	if (k == 62 || k == 65)
493 		spk = 42;
494 	if (k == 17)
495 		spk = 80;
496 	rspeak(spk);
497 }
498 
499 void
500 bug(n)
501 	int     n;
502 {
503 	printf("Please tell jim@rand.org that fatal bug %d happened.\n", n);
504 	exit(1);
505 }
506 
507 
508 void
509 checkhints()
510 {				/* 2600 &c              */
511 	int     hint;
512 	for (hint = 4; hint <= hntmax; hint++) {
513 		if (hinted[hint])
514 			continue;
515 		if (!bitset(loc, hint))
516 			hintlc[hint] = -1;
517 		hintlc[hint]++;
518 		if (hintlc[hint] < hints[hint][1])
519 			continue;
520 		switch (hint) {
521 		case 4:	/* 40400 */
522 			if (prop[grate] == 0 && !here(keys))
523 				goto l40010;
524 			goto l40020;
525 		case 5:	/* 40500 */
526 			if (here(bird) && toting(rod) && obj == bird)
527 				goto l40010;
528 			continue;	/* i.e. goto l40030 */
529 		case 6:	/* 40600 */
530 			if (here(snake) && !here(bird))
531 				goto l40010;
532 			goto l40020;
533 		case 7:	/* 40700 */
534 			if (atloc[loc] == 0 && atloc[oldloc] == 0
535 			    && atloc[oldlc2] == 0 && holdng > 1)
536 				goto l40010;
537 			goto l40020;
538 		case 8:	/* 40800 */
539 			if (prop[emrald] != -1 && prop[pyram] == -1)
540 				goto l40010;
541 			goto l40020;
542 		case 9:
543 			goto l40010;	/* 40900 */
544 		default:
545 			bug(27);
546 		}
547 l40010:	hintlc[hint] = 0;
548 		if (!yes(hints[hint][3], 0, 54))
549 			continue;
550 		printf("I am prepared to give you a hint, but it will ");
551 		printf("cost you %d points.\n", hints[hint][2]);
552 		hinted[hint] = yes(175, hints[hint][4], 54);
553 l40020:	hintlc[hint] = 0;
554 	}
555 }
556 
557 
558 int
559 trsay()
560 {				/* 9030                 */
561 	int     i;
562 	if (*wd2 != 0)
563 		copystr(wd2, wd1);
564 	i = vocab(wd1, -1, 0);
565 	if (i == 62 || i == 65 || i == 71 || i == 2025) {
566 		*wd2 = 0;
567 		obj = 0;
568 		return (2630);
569 	}
570 	printf("\nOkay, \"%s\".\n", wd2);
571 	return (2012);
572 }
573 
574 
575 int
576 trtake()
577 {				/* 9010                 */
578 	if (toting(obj))
579 		return (2011);	/* 9010 */
580 	spk = 25;
581 	if (obj == plant && prop[plant] <= 0)
582 		spk = 115;
583 	if (obj == bear && prop[bear] == 1)
584 		spk = 169;
585 	if (obj == chain && prop[bear] != 0)
586 		spk = 170;
587 	if (fixed[obj] != 0)
588 		return (2011);
589 	if (obj == water || obj == oil) {
590 		if (here(bottle) && liq() == obj) {
591 			obj = bottle;
592 			goto l9017;
593 		}
594 		obj = bottle;
595 		if (toting(bottle) && prop[bottle] == 1)
596 			return (9220);
597 		if (prop[bottle] != 1)
598 			spk = 105;
599 		if (!toting(bottle))
600 			spk = 104;
601 		return (2011);
602 	}
603 l9017:	if (holdng >= 7) {
604 		rspeak(92);
605 		return (2012);
606 	}
607 	if (obj == bird) {
608 		if (prop[bird] != 0)
609 			goto l9014;
610 		if (toting(rod)) {
611 			rspeak(26);
612 			return (2012);
613 		}
614 		if (!toting(cage)) {	/* 9013 */
615 			rspeak(27);
616 			return (2012);
617 		}
618 		prop[bird] = 1;	/* 9015 */
619 	}
620 l9014:	if ((obj == bird || obj == cage) && prop[bird] != 0)
621 		carry(bird + cage - obj, loc);
622 	carry(obj, loc);
623 	k = liq();
624 	if (obj == bottle && k != 0)
625 		place[k] = -1;
626 	return (2009);
627 }
628 
629 
630 int
631 dropper()
632 {				/* 9021                 */
633 	k = liq();
634 	if (k == obj)
635 		obj = bottle;
636 	if (obj == bottle && k != 0)
637 		place[k] = 0;
638 	if (obj == cage && prop[bird] != 0)
639 		drop(bird, loc);
640 	if (obj == bird)
641 		prop[bird] = 0;
642 	drop(obj, loc);
643 	return (2012);
644 }
645 
646 int
647 trdrop()
648 {				/* 9020                 */
649 	if (toting(rod2) && obj == rod && !toting(rod))
650 		obj = rod2;
651 	if (!toting(obj))
652 		return (2011);
653 	if (obj == bird && here(snake)) {
654 		rspeak(30);
655 		if (closed)
656 			return (19000);
657 		dstroy(snake);
658 		prop[snake] = 1;
659 		return (dropper());
660 	}
661 	if (obj == coins && here(vend)) {	/* 9024                 */
662 		dstroy(coins);
663 		drop(batter, loc);
664 		pspeak(batter, 0);
665 		return (2012);
666 	}
667 	if (obj == bird && at(dragon) && prop[dragon] == 0) {	/* 9025         */
668 		rspeak(154);
669 		dstroy(bird);
670 		prop[bird] = 0;
671 		if (place[snake] == plac[snake])
672 			tally2--;
673 		return (2012);
674 	}
675 	if (obj == bear && at(troll)) {	/* 9026                 */
676 		rspeak(163);
677 		move(troll, 0);
678 		move(troll + 100, 0);
679 		move(troll2, plac[troll]);
680 		move(troll2 + 100, fixd[troll]);
681 		juggle(chasm);
682 		prop[troll] = 2;
683 		return (dropper());
684 	}
685 	if (obj != vase || loc == plac[pillow]) {	/* 9027                 */
686 		rspeak(54);
687 		return (dropper());
688 	}
689 	prop[vase] = 2;		/* 9028                 */
690 	if (at(pillow))
691 		prop[vase] = 0;
692 	pspeak(vase, prop[vase] + 1);
693 	if (prop[vase] != 0)
694 		fixed[vase] = -1;
695 	return (dropper());
696 }
697 
698 
699 int
700 tropen()
701 {				/* 9040                 */
702 	if (obj == clam || obj == oyster) {
703 		k = 0;		/* 9046                 */
704 		if (obj == oyster)
705 			k = 1;
706 		spk = 124 + k;
707 		if (toting(obj))
708 			spk = 120 + k;
709 		if (!toting(tridnt))
710 			spk = 122 + k;
711 		if (verb == lock)
712 			spk = 61;
713 		if (spk != 124)
714 			return (2011);
715 		dstroy(clam);
716 		drop(oyster, loc);
717 		drop(pearl, 105);
718 		return (2011);
719 	}
720 	if (obj == door)
721 		spk = 111;
722 	if (obj == door && prop[door] == 1)
723 		spk = 54;
724 	if (obj == cage)
725 		spk = 32;
726 	if (obj == keys)
727 		spk = 55;
728 	if (obj == grate || obj == chain)
729 		spk = 31;
730 	if (spk != 31 || !here(keys))
731 		return (2011);
732 	if (obj == chain) {
733 		if (verb == lock) {
734 			spk = 172;	/* 9049: lock           */
735 			if (prop[chain] != 0)
736 				spk = 34;
737 			if (loc != plac[chain])
738 				spk = 173;
739 			if (spk != 172)
740 				return (2011);
741 			prop[chain] = 2;
742 			if (toting(chain))
743 				drop(chain, loc);
744 			fixed[chain] = -1;
745 			return (2011);
746 		}
747 		spk = 171;
748 		if (prop[bear] == 0)
749 			spk = 41;
750 		if (prop[chain] == 0)
751 			spk = 37;
752 		if (spk != 171)
753 			return (2011);
754 		prop[chain] = 0;
755 		fixed[chain] = 0;
756 		if (prop[bear] != 3)
757 			prop[bear] = 2;
758 		fixed[bear] = 2 - prop[bear];
759 		return (2011);
760 	}
761 	if (closng) {
762 		k = 130;
763 		if (!panic)
764 			clock2 = 15;
765 		panic = TRUE;
766 		return (2010);
767 	}
768 	k = 34 + prop[grate];	/* 9043                 */
769 	prop[grate] = 1;
770 	if (verb == lock)
771 		prop[grate] = 0;
772 	k = k + 2 * prop[grate];
773 	return (2010);
774 }
775 
776 
777 int
778 trkill()
779 {				/* 9120                         */
780 	int     i;
781 	for (i = 1; i <= 5; i++)
782 		if (dloc[i] == loc && dflag >= 2)
783 			break;
784 	if (i == 6)
785 		i = 0;
786 	if (obj == 0) {		/* 9122                         */
787 		if (i != 0)
788 			obj = dwarf;
789 		if (here(snake))
790 			obj = obj * 100 + snake;
791 		if (at(dragon) && prop[dragon] == 0)
792 			obj = obj * 100 + dragon;
793 		if (at(troll))
794 			obj = obj * 100 + troll;
795 		if (here(bear) && prop[bear] == 0)
796 			obj = obj * 100 + bear;
797 		if (obj > 100)
798 			return (8000);
799 		if (obj == 0) {
800 			if (here(bird) && verb != throw)
801 				obj = bird;
802 			if (here(clam) || here(oyster))
803 				obj = 100 * obj + clam;
804 			if (obj > 100)
805 				return (8000);
806 		}
807 	}
808 	if (obj == bird) {	/* 9124                         */
809 		spk = 137;
810 		if (closed)
811 			return (2011);
812 		dstroy(bird);
813 		prop[bird] = 0;
814 		if (place[snake] == plac[snake])
815 			tally2++;
816 		spk = 45;
817 	}
818 	if (obj == 0)
819 		spk = 44;	/* 9125                         */
820 	if (obj == clam || obj == oyster)
821 		spk = 150;
822 	if (obj == snake)
823 		spk = 46;
824 	if (obj == dwarf)
825 		spk = 49;
826 	if (obj == dwarf && closed)
827 		return (19000);
828 	if (obj == dragon)
829 		spk = 147;
830 	if (obj == troll)
831 		spk = 157;
832 	if (obj == bear)
833 		spk = 165 + (prop[bear] + 1) / 2;
834 	if (obj != dragon || prop[dragon] != 0)
835 		return (2011);
836 	rspeak(49);
837 	verb = 0;
838 	obj = 0;
839 	getin(&wd1, &wd2);
840 	if (!weq(wd1, "y") && !weq(wd1, "yes"))
841 		return (2608);
842 	pspeak(dragon, 1);
843 	prop[dragon] = 2;
844 	prop[rug] = 0;
845 	k = (plac[dragon] + fixd[dragon]) / 2;
846 	move(dragon + 100, -1);
847 	move(rug + 100, 0);
848 	move(dragon, k);
849 	move(rug, k);
850 	for (obj = 1; obj <= 100; obj++)
851 		if (place[obj] == plac[dragon] || place[obj] == fixd[dragon])
852 			move(obj, k);
853 	loc = k;
854 	k = null;
855 	return (8);
856 }
857 
858 
859 int
860 trtoss()
861 {				/* 9170: throw                  */
862 	int     i;
863 	if (toting(rod2) && obj == rod && !toting(rod))
864 		obj = rod2;
865 	if (!toting(obj))
866 		return (2011);
867 	if (obj >= 50 && obj <= maxtrs && at(troll)) {
868 		spk = 159;	/* 9178                 */
869 		drop(obj, 0);
870 		move(troll, 0);
871 		move(troll + 100, 0);
872 		drop(troll2, plac[troll]);
873 		drop(troll2 + 100, fixd[troll]);
874 		juggle(chasm);
875 		return (2011);
876 	}
877 	if (obj == food && here(bear)) {
878 		obj = bear;	/* 9177                 */
879 		return (9210);
880 	}
881 	if (obj != axe)
882 		return (9020);
883 	for (i = 1; i <= 5; i++) {
884 		if (dloc[i] == loc) {
885 			spk = 48;	/* 9172                 */
886 			if (ran(3) == 0 || saved != -1)
887 	l9175:		{
888 				rspeak(spk);
889 				drop(axe, loc);
890 				k = null;
891 				return (8);
892 			}
893 			dseen[i] = FALSE;
894 			dloc[i] = 0;
895 			spk = 47;
896 			dkill++;
897 			if (dkill == 1)
898 				spk = 149;
899 			goto l9175;
900 		}
901 	}
902 	spk = 152;
903 	if (at(dragon) && prop[dragon] == 0)
904 		goto l9175;
905 	spk = 158;
906 	if (at(troll))
907 		goto l9175;
908 	if (here(bear) && prop[bear] == 0) {
909 		spk = 164;
910 		drop(axe, loc);
911 		fixed[axe] = -1;
912 		prop[axe] = 1;
913 		juggle(bear);
914 		return (2011);
915 	}
916 	obj = 0;
917 	return (9120);
918 }
919 
920 
921 int
922 trfeed()
923 {				/* 9210                 */
924 	if (obj == bird) {
925 		spk = 100;
926 		return (2011);
927 	}
928 	if (obj == snake || obj == dragon || obj == troll) {
929 		spk = 102;
930 		if (obj == dragon && prop[dragon] != 0)
931 			spk = 110;
932 		if (obj == troll)
933 			spk = 182;
934 		if (obj != snake || closed || !here(bird))
935 			return (2011);
936 		spk = 101;
937 		dstroy(bird);
938 		prop[bird] = 0;
939 		tally2++;
940 		return (2011);
941 	}
942 	if (obj == dwarf) {
943 		if (!here(food))
944 			return (2011);
945 		spk = 103;
946 		dflag++;
947 		return (2011);
948 	}
949 	if (obj == bear) {
950 		if (prop[bear] == 0)
951 			spk = 102;
952 		if (prop[bear] == 3)
953 			spk = 110;
954 		if (!here(food))
955 			return (2011);
956 		dstroy(food);
957 		prop[bear] = 1;
958 		fixed[axe] = 0;
959 		prop[axe] = 0;
960 		spk = 168;
961 		return (2011);
962 	}
963 	spk = 14;
964 	return (2011);
965 }
966 
967 
968 int
969 trfill()
970 {				/* 9220 */
971 	if (obj == vase) {
972 		spk = 29;
973 		if (liqloc(loc) == 0)
974 			spk = 144;
975 		if (liqloc(loc) == 0 || !toting(vase))
976 			return (2011);
977 		rspeak(145);
978 		prop[vase] = 2;
979 		fixed[vase] = -1;
980 		return (9020);	/* advent/10 goes to 9024 */
981 	}
982 	if (obj != 0 && obj != bottle)
983 		return (2011);
984 	if (obj == 0 && !here(bottle))
985 		return (8000);
986 	spk = 107;
987 	if (liqloc(loc) == 0)
988 		spk = 106;
989 	if (liq() != 0)
990 		spk = 105;
991 	if (spk != 107)
992 		return (2011);
993 	prop[bottle] = ((cond[loc] % 4) / 2) * 2;
994 	k = liq();
995 	if (toting(bottle))
996 		place[k] = -1;
997 	if (k == oil)
998 		spk = 108;
999 	return (2011);
1000 }
1001 
1002 
1003 void
1004 closing()
1005 {				/* 10000 */
1006 	int     i;
1007 
1008 	prop[grate] = prop[fissur] = 0;
1009 	for (i = 1; i <= 6; i++) {
1010 		dseen[i] = FALSE;
1011 		dloc[i] = 0;
1012 	}
1013 	move(troll, 0);
1014 	move(troll + 100, 0);
1015 	move(troll2, plac[troll]);
1016 	move(troll2 + 100, fixd[troll]);
1017 	juggle(chasm);
1018 	if (prop[bear] != 3)
1019 		dstroy(bear);
1020 	prop[chain] = 0;
1021 	fixed[chain] = 0;
1022 	prop[axe] = 0;
1023 	fixed[axe] = 0;
1024 	rspeak(129);
1025 	clock1 = -1;
1026 	closng = TRUE;
1027 }
1028 
1029 
1030 void
1031 caveclose()
1032 {				/* 11000 */
1033 	int     i;
1034 	prop[bottle] = put(bottle, 115, 1);
1035 	prop[plant] = put(plant, 115, 0);
1036 	prop[oyster] = put(oyster, 115, 0);
1037 	prop[lamp] = put(lamp, 115, 0);
1038 	prop[rod] = put(rod, 115, 0);
1039 	prop[dwarf] = put(dwarf, 115, 0);
1040 	loc = 115;
1041 	oldloc = 115;
1042 	newloc = 115;
1043 
1044 	put(grate, 116, 0);
1045 	prop[snake] = put(snake, 116, 1);
1046 	prop[bird] = put(bird, 116, 1);
1047 	prop[cage] = put(cage, 116, 0);
1048 	prop[rod2] = put(rod2, 116, 0);
1049 	prop[pillow] = put(pillow, 116, 0);
1050 
1051 	prop[mirror] = put(mirror, 115, 0);
1052 	fixed[mirror] = 116;
1053 
1054 	for (i = 1; i <= 100; i++)
1055 		if (toting(i))
1056 			dstroy(i);
1057 	rspeak(132);
1058 	closed = TRUE;
1059 }
1060