xref: /netbsd-src/games/adventure/subr.c (revision 1182a44c59cae4d586117d55eca24b4b8b173211)
1*1182a44cSrillig /*	$NetBSD: subr.c,v 1.14 2021/05/02 12:50:43 rillig Exp $	*/
243b95251Scgd 
3107c0a28Sjtc /*-
4107c0a28Sjtc  * Copyright (c) 1991, 1993
5107c0a28Sjtc  *	The Regents of the University of California.  All rights reserved.
6107c0a28Sjtc  *
7107c0a28Sjtc  * The game adventure was originally written in Fortran by Will Crowther
8107c0a28Sjtc  * and Don Woods.  It was later translated to C and enhanced by Jim
9107c0a28Sjtc  * Gillogly.  This code is derived from software contributed to Berkeley
10107c0a28Sjtc  * by Jim Gillogly at The Rand Corporation.
11107c0a28Sjtc  *
12107c0a28Sjtc  * Redistribution and use in source and binary forms, with or without
13107c0a28Sjtc  * modification, are permitted provided that the following conditions
14107c0a28Sjtc  * are met:
15107c0a28Sjtc  * 1. Redistributions of source code must retain the above copyright
16107c0a28Sjtc  *    notice, this list of conditions and the following disclaimer.
17107c0a28Sjtc  * 2. Redistributions in binary form must reproduce the above copyright
18107c0a28Sjtc  *    notice, this list of conditions and the following disclaimer in the
19107c0a28Sjtc  *    documentation and/or other materials provided with the distribution.
20e5aeb4eaSagc  * 3. Neither the name of the University nor the names of its contributors
21107c0a28Sjtc  *    may be used to endorse or promote products derived from this software
22107c0a28Sjtc  *    without specific prior written permission.
23107c0a28Sjtc  *
24107c0a28Sjtc  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25107c0a28Sjtc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26107c0a28Sjtc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27107c0a28Sjtc  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28107c0a28Sjtc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29107c0a28Sjtc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30107c0a28Sjtc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31107c0a28Sjtc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32107c0a28Sjtc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33107c0a28Sjtc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34107c0a28Sjtc  * SUCH DAMAGE.
35107c0a28Sjtc  */
36107c0a28Sjtc 
37690bee10Schristos #include <sys/cdefs.h>
38107c0a28Sjtc #ifndef lint
3943b95251Scgd #if 0
40107c0a28Sjtc static char sccsid[] = "@(#)subr.c	8.1 (Berkeley) 5/31/93";
4143b95251Scgd #else
42*1182a44cSrillig __RCSID("$NetBSD: subr.c,v 1.14 2021/05/02 12:50:43 rillig Exp $");
4343b95251Scgd #endif
44107c0a28Sjtc #endif				/* not lint */
45107c0a28Sjtc 
46107c0a28Sjtc /*      Re-coding of advent in C: subroutines from main                 */
47107c0a28Sjtc 
48690bee10Schristos #include <stdio.h>
4932330650Smatt #include <stdlib.h>
50107c0a28Sjtc #include "hdr.h"
51690bee10Schristos #include "extern.h"
52107c0a28Sjtc 
53c62bf84cSdholland static void badmove(void);
54c62bf84cSdholland static int bitset(int, int);
55c62bf84cSdholland static int dropper(void);
56c62bf84cSdholland static int liq2(int);
57c62bf84cSdholland static int mback(void);
58c62bf84cSdholland static int specials(void);
59c62bf84cSdholland static int trbridge(void);
60c62bf84cSdholland 
61107c0a28Sjtc /*              Statement functions     */
62690bee10Schristos int
toting(int objj)63243d04efSjmc toting(int objj)
6484f80fd6Slukem {
6584f80fd6Slukem 	if (place[objj] == -1)
6684f80fd6Slukem 		return (TRUE);
6784f80fd6Slukem 	else
6884f80fd6Slukem 		return (FALSE);
69107c0a28Sjtc }
70107c0a28Sjtc 
71690bee10Schristos int
here(int objj)72243d04efSjmc here(int objj)
7384f80fd6Slukem {
7484f80fd6Slukem 	if (place[objj] == loc || toting(objj))
7584f80fd6Slukem 		return (TRUE);
7684f80fd6Slukem 	else
7784f80fd6Slukem 		return (FALSE);
78107c0a28Sjtc }
79107c0a28Sjtc 
80690bee10Schristos int
at(int objj)81243d04efSjmc at(int objj)
8284f80fd6Slukem {
8384f80fd6Slukem 	if (place[objj] == loc || fixed[objj] == loc)
8484f80fd6Slukem 		return (TRUE);
8584f80fd6Slukem 	else
8684f80fd6Slukem 		return (FALSE);
87107c0a28Sjtc }
88107c0a28Sjtc 
89c62bf84cSdholland static int
liq2(int pbotl)90243d04efSjmc liq2(int pbotl)
9184f80fd6Slukem {
9284f80fd6Slukem 	return ((1 - pbotl) * water + (pbotl / 2) * (water + oil));
93107c0a28Sjtc }
94107c0a28Sjtc 
95690bee10Schristos int
liq(void)96243d04efSjmc liq(void)
9784f80fd6Slukem {
9884f80fd6Slukem 	int     i;
99107c0a28Sjtc 	i = prop[bottle];
10084f80fd6Slukem 	if (i > -1 - i)
10184f80fd6Slukem 		return (liq2(i));
10284f80fd6Slukem 	else
10384f80fd6Slukem 		return (liq2(-1 - i));
104107c0a28Sjtc }
105107c0a28Sjtc 
106243d04efSjmc /* may want to clean this one up a bit */
107690bee10Schristos int
liqloc(int locc)108243d04efSjmc liqloc(int locc)
10984f80fd6Slukem {
11084f80fd6Slukem 	int     i, j, l;
111107c0a28Sjtc 	i = cond[locc] / 2;
112107c0a28Sjtc 	j = ((i * 2) % 8) - 5;
113107c0a28Sjtc 	l = cond[locc] / 4;
114107c0a28Sjtc 	l = l % 2;
115107c0a28Sjtc 	return (liq2(j * l + 1));
116107c0a28Sjtc }
117107c0a28Sjtc 
118c62bf84cSdholland static int
bitset(int l,int n)119243d04efSjmc bitset(int l, int n)
12084f80fd6Slukem {
12184f80fd6Slukem 	if (cond[l] & setbit[n])
12284f80fd6Slukem 		return (TRUE);
123107c0a28Sjtc 	return (FALSE);
124107c0a28Sjtc }
125107c0a28Sjtc 
126690bee10Schristos int
forced(int locc)127243d04efSjmc forced(int locc)
12884f80fd6Slukem {
12984f80fd6Slukem 	if (cond[locc] == 2)
13084f80fd6Slukem 		return (TRUE);
131107c0a28Sjtc 	return (FALSE);
132107c0a28Sjtc }
133107c0a28Sjtc 
134690bee10Schristos int
dark(void)135243d04efSjmc dark(void)
13684f80fd6Slukem {
13784f80fd6Slukem 	if ((cond[loc] % 2) == 0 && (prop[lamp] == 0 || !here(lamp)))
138107c0a28Sjtc 		return (TRUE);
139107c0a28Sjtc 	return (FALSE);
140107c0a28Sjtc }
141107c0a28Sjtc 
142690bee10Schristos int
pct(int n)143243d04efSjmc pct(int n)
14484f80fd6Slukem {
14584f80fd6Slukem 	if (ran(100) < n)
14684f80fd6Slukem 		return (TRUE);
147107c0a28Sjtc 	return (FALSE);
148107c0a28Sjtc }
149107c0a28Sjtc 
150107c0a28Sjtc 
151690bee10Schristos int
fdwarf(void)152243d04efSjmc fdwarf(void)
15384f80fd6Slukem {				/* 71 */
15484f80fd6Slukem 	int     i, j;
155434abd72Slukem 	struct travlist *kk;
156107c0a28Sjtc 
15784f80fd6Slukem 	if (newloc != loc && !forced(loc) && !bitset(loc, 3)) {
15884f80fd6Slukem 		for (i = 1; i <= 5; i++) {
15984f80fd6Slukem 			if (odloc[i] != newloc || !dseen[i])
16084f80fd6Slukem 				continue;
161107c0a28Sjtc 			newloc = loc;
162107c0a28Sjtc 			rspeak(2);
163107c0a28Sjtc 			break;
164107c0a28Sjtc 		}
165107c0a28Sjtc 	}
166107c0a28Sjtc 	loc = newloc;		/* 74 */
16784f80fd6Slukem 	if (loc == 0 || forced(loc) || bitset(newloc, 3))
16884f80fd6Slukem 		return (2000);
16984f80fd6Slukem 	if (dflag == 0) {
17084f80fd6Slukem 		if (loc >= 15)
17184f80fd6Slukem 			dflag = 1;
172107c0a28Sjtc 		return (2000);
173107c0a28Sjtc 	}
17484f80fd6Slukem 	if (dflag == 1) {	/* 6000 */
17584f80fd6Slukem 		if (loc < 15 || pct(95))
17684f80fd6Slukem 			return (2000);
177107c0a28Sjtc 		dflag = 2;
17884f80fd6Slukem 		for (i = 1; i <= 2; i++) {
17984f80fd6Slukem 			j = 1 + ran(5);
18084f80fd6Slukem 			if (pct(50) && saved == -1)
18184f80fd6Slukem 				dloc[j] = 0;	/* 6001 */
182107c0a28Sjtc 		}
18384f80fd6Slukem 		for (i = 1; i <= 5; i++) {
18484f80fd6Slukem 			if (dloc[i] == loc)
185aa19a9d0Sdholland 				dloc[i] = daltloc;
186107c0a28Sjtc 			odloc[i] = dloc[i];	/* 6002 */
187107c0a28Sjtc 		}
188107c0a28Sjtc 		rspeak(3);
189107c0a28Sjtc 		drop(axe, loc);
190107c0a28Sjtc 		return (2000);
191107c0a28Sjtc 	}
192107c0a28Sjtc 	dtotal = attack = stick = 0;	/* 6010 */
19384f80fd6Slukem 	for (i = 1; i <= 6; i++) {	/* loop to 6030 */
19484f80fd6Slukem 		if (dloc[i] == 0)
19584f80fd6Slukem 			continue;
196107c0a28Sjtc 		j = 1;
19784f80fd6Slukem 		for (kk = travel[dloc[i]]; kk != 0; kk = kk->next) {
19884f80fd6Slukem 			newloc = kk->tloc;
199107c0a28Sjtc 			if (newloc > 300 || newloc < 15 || newloc == odloc[i]
200107c0a28Sjtc 			    || (j > 1 && newloc == tk[j - 1]) || j >= 20
201107c0a28Sjtc 			    || newloc == dloc[i] || forced(newloc)
202107c0a28Sjtc 			    || (i == 6 && bitset(newloc, 3))
20384f80fd6Slukem 			    || kk->conditions == 100)
20484f80fd6Slukem 				continue;
205107c0a28Sjtc 			tk[j++] = newloc;
206107c0a28Sjtc 		}
207107c0a28Sjtc 		tk[j] = odloc[i];	/* 6016 */
20884f80fd6Slukem 		if (j >= 2)
20984f80fd6Slukem 			j--;
210107c0a28Sjtc 		j = 1 + ran(j);
211107c0a28Sjtc 		odloc[i] = dloc[i];
212107c0a28Sjtc 		dloc[i] = tk[j];
213243d04efSjmc 		dseen[i] = (dseen[i] && loc >= 15) ||
214243d04efSjmc 		    (dloc[i] == loc || odloc[i] == loc);
21584f80fd6Slukem 		if (!dseen[i])
21684f80fd6Slukem 			continue;	/* i.e. goto 6030 */
217107c0a28Sjtc 		dloc[i] = loc;
21884f80fd6Slukem 		if (i == 6) {	/* pirate's spotted him */
21984f80fd6Slukem 			if (loc == chloc || prop[chest] >= 0)
22084f80fd6Slukem 				continue;
221107c0a28Sjtc 			k = 0;
22284f80fd6Slukem 			for (j = 50; j <= maxtrs; j++) { /* loop to 6020 */
223aa19a9d0Sdholland 				if (j == pyramid && (loc == plac[pyramid]
224aa19a9d0Sdholland 					|| loc == plac[emerald]))
22584f80fd6Slukem 					goto l6020;
22684f80fd6Slukem 				if (toting(j))
22784f80fd6Slukem 					goto l6022;
22884f80fd6Slukem 		l6020:		if (here(j))
22984f80fd6Slukem 					k = 1;
230107c0a28Sjtc 			}	/* 6020 */
231107c0a28Sjtc 			if (tally == tally2 + 1 && k == 0 && place[chest] == 0
23284f80fd6Slukem 			    && here(lamp) && prop[lamp] == 1)
23384f80fd6Slukem 				goto l6025;
234107c0a28Sjtc 			if (odloc[6] != dloc[6] && pct(20))
235107c0a28Sjtc 				rspeak(127);
236107c0a28Sjtc 			continue;	/* to 6030 */
237107c0a28Sjtc 	l6022:		rspeak(128);
238aa19a9d0Sdholland 			if (place[message] == 0)
23984f80fd6Slukem 				move(chest, chloc);
240aa19a9d0Sdholland 			move(message, chloc2);
24184f80fd6Slukem 			for (j = 50; j <= maxtrs; j++) { /* loop to 6023 */
242aa19a9d0Sdholland 				if (j == pyramid && (loc == plac[pyramid]
243aa19a9d0Sdholland 					|| loc == plac[emerald]))
24484f80fd6Slukem 					continue;
24584f80fd6Slukem 				if (at(j) && fixed[j] == 0)
24684f80fd6Slukem 					carry(j, loc);
24784f80fd6Slukem 				if (toting(j))
24884f80fd6Slukem 					drop(j, chloc);
249107c0a28Sjtc 			}
250107c0a28Sjtc 	l6024:		dloc[6] = odloc[6] = chloc;
251107c0a28Sjtc 			dseen[6] = FALSE;
252107c0a28Sjtc 			continue;
253107c0a28Sjtc 	l6025:		rspeak(186);
254107c0a28Sjtc 			move(chest, chloc);
255aa19a9d0Sdholland 			move(message, chloc2);
256107c0a28Sjtc 			goto l6024;
257107c0a28Sjtc 		}
258107c0a28Sjtc 		dtotal++;	/* 6027 */
25984f80fd6Slukem 		if (odloc[i] != dloc[i])
26084f80fd6Slukem 			continue;
261107c0a28Sjtc 		attack++;
26284f80fd6Slukem 		if (knfloc >= 0)
26384f80fd6Slukem 			knfloc = loc;
26484f80fd6Slukem 		if (ran(1000) < 95 * (dflag - 2))
26584f80fd6Slukem 			stick++;
266107c0a28Sjtc 	}			/* 6030 */
26784f80fd6Slukem 	if (dtotal == 0)
26884f80fd6Slukem 		return (2000);
26984f80fd6Slukem 	if (dtotal != 1) {
27084f80fd6Slukem 		printf("There are %d threatening little dwarves ", dtotal);
271107c0a28Sjtc 		printf("in the room with you.\n");
27284f80fd6Slukem 	} else
27384f80fd6Slukem 		rspeak(4);
27484f80fd6Slukem 	if (attack == 0)
27584f80fd6Slukem 		return (2000);
27684f80fd6Slukem 	if (dflag == 2)
27784f80fd6Slukem 		dflag = 3;
27884f80fd6Slukem 	if (saved != -1)
27984f80fd6Slukem 		dflag = 20;
28084f80fd6Slukem 	if (attack != 1) {
28184f80fd6Slukem 		printf("%d of them throw knives at you!\n", attack);
282107c0a28Sjtc 		k = 6;
28384f80fd6Slukem l82:		if (stick <= 1) {	/* 82 */
28484f80fd6Slukem 			rspeak(k + stick);
28584f80fd6Slukem 			if (stick == 0)
28684f80fd6Slukem 				return (2000);
28784f80fd6Slukem 		} else
288107c0a28Sjtc 			printf("%d of them get you!\n", stick);	/* 83 */
289aa19a9d0Sdholland 		oldloc2 = loc;
290107c0a28Sjtc 		return (99);
291107c0a28Sjtc 	}
292107c0a28Sjtc 	rspeak(5);
293107c0a28Sjtc 	k = 52;
294107c0a28Sjtc 	goto l82;
295107c0a28Sjtc }
296107c0a28Sjtc 
297107c0a28Sjtc 
298243d04efSjmc /* label 8              */
299690bee10Schristos int
march(void)300243d04efSjmc march(void)
301243d04efSjmc {
30284f80fd6Slukem 	int     ll1, ll2;
303107c0a28Sjtc 
30484f80fd6Slukem 	if ((tkk = travel[newloc = loc]) == 0)
30584f80fd6Slukem 		bug(26);
30684f80fd6Slukem 	if (k == null)
30784f80fd6Slukem 		return (2);
30884f80fd6Slukem 	if (k == cave) {	/* 40                   */
30984f80fd6Slukem 		if (loc < 8)
31084f80fd6Slukem 			rspeak(57);
31184f80fd6Slukem 		if (loc >= 8)
31284f80fd6Slukem 			rspeak(58);
313107c0a28Sjtc 		return (2);
314107c0a28Sjtc 	}
31584f80fd6Slukem 	if (k == look) {	/* 30                   */
31684f80fd6Slukem 		if (detail++ < 3)
31784f80fd6Slukem 			rspeak(15);
318aa19a9d0Sdholland 		wasdark = FALSE;
319107c0a28Sjtc 		abb[loc] = 0;
320107c0a28Sjtc 		return (2);
321107c0a28Sjtc 	}
32284f80fd6Slukem 	if (k == back) {	/* 20                   */
32384f80fd6Slukem 		switch (mback()) {
32484f80fd6Slukem 		case 2:
32584f80fd6Slukem 			return (2);
32684f80fd6Slukem 		case 9:
32784f80fd6Slukem 			goto l9;
32884f80fd6Slukem 		default:
32984f80fd6Slukem 			bug(100);
330107c0a28Sjtc 		}
331107c0a28Sjtc 	}
332aa19a9d0Sdholland 	oldloc2 = oldloc;
333107c0a28Sjtc 	oldloc = loc;
334107c0a28Sjtc l9:
335107c0a28Sjtc 	for (; tkk != 0; tkk = tkk->next)
33684f80fd6Slukem 		if (tkk->tverb == 1 || tkk->tverb == k)
33784f80fd6Slukem 			break;
33884f80fd6Slukem 	if (tkk == 0) {
33984f80fd6Slukem 		badmove();
340107c0a28Sjtc 		return (2);
341107c0a28Sjtc 	}
342107c0a28Sjtc l11:	ll1 = tkk->conditions;	/* 11                   */
343107c0a28Sjtc 	ll2 = tkk->tloc;
344107c0a28Sjtc 	newloc = ll1;		/* newloc=conditions    */
345107c0a28Sjtc 	k = newloc % 100;	/* k used for prob      */
34684f80fd6Slukem 	if (newloc <= 300) {
34784f80fd6Slukem 		if (newloc <= 100) {	/* 13                   */
34884f80fd6Slukem 			if (newloc != 0 && !pct(newloc))
34984f80fd6Slukem 				goto l12;	/* 14   */
350107c0a28Sjtc 	l16:		newloc = ll2;	/* newloc=location      */
35184f80fd6Slukem 			if (newloc <= 300)
35284f80fd6Slukem 				return (2);
353107c0a28Sjtc 			if (newloc <= 500)
35484f80fd6Slukem 				switch (specials()) {	/* to 30000           */
35584f80fd6Slukem 				case 2:
35684f80fd6Slukem 					return (2);
35784f80fd6Slukem 				case 12:
35884f80fd6Slukem 					goto l12;
35984f80fd6Slukem 				case 99:
36084f80fd6Slukem 					return (99);
36184f80fd6Slukem 				default:
36284f80fd6Slukem 					bug(101);
363107c0a28Sjtc 				}
364107c0a28Sjtc 			rspeak(newloc - 500);
365107c0a28Sjtc 			newloc = loc;
366107c0a28Sjtc 			return (2);
367107c0a28Sjtc 		}
36884f80fd6Slukem 		if (toting(k) || (newloc > 200 && at(k)))
36984f80fd6Slukem 			goto l16;
370107c0a28Sjtc 		goto l12;
371107c0a28Sjtc 	}
37284f80fd6Slukem 	if (prop[k] != (newloc / 100) - 3)
37384f80fd6Slukem 		goto l16;	/* newloc still conditions */
374107c0a28Sjtc l12:				/* alternative to probability move      */
375107c0a28Sjtc 	for (; tkk != 0; tkk = tkk->next)
37684f80fd6Slukem 		if (tkk->tloc != ll2 || tkk->conditions != ll1)
37784f80fd6Slukem 			break;
37884f80fd6Slukem 	if (tkk == 0)
37984f80fd6Slukem 		bug(25);
380107c0a28Sjtc 	goto l11;
381107c0a28Sjtc }
382107c0a28Sjtc 
383243d04efSjmc /* 20                   */
384c62bf84cSdholland static int
mback(void)385243d04efSjmc mback(void)
386243d04efSjmc {
38784f80fd6Slukem 	struct travlist *tk2, *j;
388434abd72Slukem 	int     ll;
38984f80fd6Slukem 	if (forced(k = oldloc))
390aa19a9d0Sdholland 		k = oldloc2;	/* k=location           */
391aa19a9d0Sdholland 	oldloc2 = oldloc;
392107c0a28Sjtc 	oldloc = loc;
393107c0a28Sjtc 	tk2 = 0;
39484f80fd6Slukem 	if (k == loc) {
39584f80fd6Slukem 		rspeak(91);
396107c0a28Sjtc 		return (2);
397107c0a28Sjtc 	}
39884f80fd6Slukem 	for (; tkk != 0; tkk = tkk->next) {	/* 21                   */
39984f80fd6Slukem 		ll = tkk->tloc;
40084f80fd6Slukem 		if (ll == k) {
40184f80fd6Slukem 			k = tkk->tverb;	/* k back to verb       */
402107c0a28Sjtc 			tkk = travel[loc];
403107c0a28Sjtc 			return (9);
404107c0a28Sjtc 		}
40584f80fd6Slukem 		if (ll <= 300) {
40684f80fd6Slukem 			j = travel[loc];
40784f80fd6Slukem 			if (forced(ll) && k == j->tloc)
40884f80fd6Slukem 				tk2 = tkk;
409107c0a28Sjtc 		}
410107c0a28Sjtc 	}
411107c0a28Sjtc 	tkk = tk2;		/* 23                   */
41284f80fd6Slukem 	if (tkk != 0) {
41384f80fd6Slukem 		k = tkk->tverb;
414107c0a28Sjtc 		tkk = travel[loc];
415107c0a28Sjtc 		return (9);
416107c0a28Sjtc 	}
417107c0a28Sjtc 	rspeak(140);
418107c0a28Sjtc 	return (2);
419107c0a28Sjtc }
420107c0a28Sjtc 
421243d04efSjmc /* 30000                */
422c62bf84cSdholland static int
specials(void)423243d04efSjmc specials(void)
424243d04efSjmc {
42584f80fd6Slukem 	switch (newloc -= 300) {
42684f80fd6Slukem 		case 1:		/* 30100                */
427107c0a28Sjtc 		newloc = 99 + 100 - loc;
428aa19a9d0Sdholland 		if (holding == 0 || (holding == 1 && toting(emerald)))
42984f80fd6Slukem 			return (2);
430107c0a28Sjtc 		newloc = loc;
431107c0a28Sjtc 		rspeak(117);
432107c0a28Sjtc 		return (2);
433107c0a28Sjtc 	case 2:		/* 30200                */
434aa19a9d0Sdholland 		drop(emerald, loc);
435107c0a28Sjtc 		return (12);
436107c0a28Sjtc 	case 3:		/* to 30300             */
437107c0a28Sjtc 		return (trbridge());
43884f80fd6Slukem 	default:
43984f80fd6Slukem 		bug(29);
440107c0a28Sjtc 	}
441107c0a28Sjtc }
442107c0a28Sjtc 
443243d04efSjmc /* 30300                */
444c62bf84cSdholland static int
trbridge(void)445243d04efSjmc trbridge(void)
446243d04efSjmc {
44784f80fd6Slukem 	if (prop[troll] == 1) {
44884f80fd6Slukem 		pspeak(troll, 1);
449107c0a28Sjtc 		prop[troll] = 0;
450107c0a28Sjtc 		move(troll2, 0);
451107c0a28Sjtc 		move(troll2 + 100, 0);
452107c0a28Sjtc 		move(troll, plac[troll]);
453107c0a28Sjtc 		move(troll + 100, fixd[troll]);
454107c0a28Sjtc 		juggle(chasm);
455107c0a28Sjtc 		newloc = loc;
456107c0a28Sjtc 		return (2);
457107c0a28Sjtc 	}
458107c0a28Sjtc 	newloc = plac[troll] + fixd[troll] - loc;	/* 30310    */
45984f80fd6Slukem 	if (prop[troll] == 0)
46084f80fd6Slukem 		prop[troll] = 1;
46184f80fd6Slukem 	if (!toting(bear))
46284f80fd6Slukem 		return (2);
463107c0a28Sjtc 	rspeak(162);
464107c0a28Sjtc 	prop[chasm] = 1;
465107c0a28Sjtc 	prop[troll] = 2;
466107c0a28Sjtc 	drop(bear, newloc);
467107c0a28Sjtc 	fixed[bear] = -1;
468107c0a28Sjtc 	prop[bear] = 3;
46984f80fd6Slukem 	if (prop[spices] < 0)
47084f80fd6Slukem 		tally2++;
471aa19a9d0Sdholland 	oldloc2 = newloc;
472107c0a28Sjtc 	return (99);
473107c0a28Sjtc }
474107c0a28Sjtc 
475243d04efSjmc /* 20                   */
476c62bf84cSdholland static void
badmove(void)477243d04efSjmc badmove(void)
478243d04efSjmc {
47984f80fd6Slukem 	spk = 12;
48084f80fd6Slukem 	if (k >= 43 && k <= 50)
48184f80fd6Slukem 		spk = 9;
48284f80fd6Slukem 	if (k == 29 || k == 30)
48384f80fd6Slukem 		spk = 9;
48484f80fd6Slukem 	if (k == 7 || k == 36 || k == 37)
48584f80fd6Slukem 		spk = 10;
48684f80fd6Slukem 	if (k == 11 || k == 19)
48784f80fd6Slukem 		spk = 11;
48884f80fd6Slukem 	if (verb == find || verb == invent)
48984f80fd6Slukem 		spk = 59;
49084f80fd6Slukem 	if (k == 62 || k == 65)
49184f80fd6Slukem 		spk = 42;
49284f80fd6Slukem 	if (k == 17)
49384f80fd6Slukem 		spk = 80;
494107c0a28Sjtc 	rspeak(spk);
495107c0a28Sjtc }
496107c0a28Sjtc 
497dd397c84Shubertf void
bug(int n)498243d04efSjmc bug(int n)
49984f80fd6Slukem {
50084f80fd6Slukem 	printf("Please tell jim@rand.org that fatal bug %d happened.\n", n);
501006cc8acShubertf 	exit(1);
502107c0a28Sjtc }
503107c0a28Sjtc 
504243d04efSjmc /* 2600 &c              */
505dd397c84Shubertf void
checkhints(void)506243d04efSjmc checkhints(void)
507243d04efSjmc {
50884f80fd6Slukem 	int     hint;
509aa19a9d0Sdholland 	for (hint = 4; hint <= hintmax; hint++) {
51084f80fd6Slukem 		if (hinted[hint])
51184f80fd6Slukem 			continue;
51284f80fd6Slukem 		if (!bitset(loc, hint))
51384f80fd6Slukem 			hintlc[hint] = -1;
514107c0a28Sjtc 		hintlc[hint]++;
51584f80fd6Slukem 		if (hintlc[hint] < hints[hint][1])
51684f80fd6Slukem 			continue;
51784f80fd6Slukem 		switch (hint) {
51884f80fd6Slukem 		case 4:	/* 40400 */
51984f80fd6Slukem 			if (prop[grate] == 0 && !here(keys))
52084f80fd6Slukem 				goto l40010;
521107c0a28Sjtc 			goto l40020;
522107c0a28Sjtc 		case 5:	/* 40500 */
52384f80fd6Slukem 			if (here(bird) && toting(rod) && obj == bird)
52484f80fd6Slukem 				goto l40010;
525107c0a28Sjtc 			continue;	/* i.e. goto l40030 */
526107c0a28Sjtc 		case 6:	/* 40600 */
52784f80fd6Slukem 			if (here(snake) && !here(bird))
52884f80fd6Slukem 				goto l40010;
529107c0a28Sjtc 			goto l40020;
530107c0a28Sjtc 		case 7:	/* 40700 */
531107c0a28Sjtc 			if (atloc[loc] == 0 && atloc[oldloc] == 0
532aa19a9d0Sdholland 			    && atloc[oldloc2] == 0 && holding > 1)
53384f80fd6Slukem 				goto l40010;
534107c0a28Sjtc 			goto l40020;
535107c0a28Sjtc 		case 8:	/* 40800 */
536aa19a9d0Sdholland 			if (prop[emerald] != -1 && prop[pyramid] == -1)
53784f80fd6Slukem 				goto l40010;
538107c0a28Sjtc 			goto l40020;
539107c0a28Sjtc 		case 9:
540107c0a28Sjtc 			goto l40010;	/* 40900 */
54184f80fd6Slukem 		default:
54284f80fd6Slukem 			bug(27);
543107c0a28Sjtc 		}
544107c0a28Sjtc l40010:	hintlc[hint] = 0;
54584f80fd6Slukem 		if (!yes(hints[hint][3], 0, 54))
54684f80fd6Slukem 			continue;
547107c0a28Sjtc 		printf("I am prepared to give you a hint, but it will ");
548107c0a28Sjtc 		printf("cost you %d points.\n", hints[hint][2]);
549107c0a28Sjtc 		hinted[hint] = yes(175, hints[hint][4], 54);
550107c0a28Sjtc l40020:	hintlc[hint] = 0;
551107c0a28Sjtc 	}
552107c0a28Sjtc }
553107c0a28Sjtc 
554243d04efSjmc /* 9030                 */
555690bee10Schristos int
trsay(void)556243d04efSjmc trsay(void)
557243d04efSjmc {
55884f80fd6Slukem 	int     i;
55984f80fd6Slukem 	if (*wd2 != 0)
56084f80fd6Slukem 		copystr(wd2, wd1);
561690bee10Schristos 	i = vocab(wd1, -1, 0);
56284f80fd6Slukem 	if (i == 62 || i == 65 || i == 71 || i == 2025) {
56384f80fd6Slukem 		*wd2 = 0;
564107c0a28Sjtc 		obj = 0;
565107c0a28Sjtc 		return (2630);
566107c0a28Sjtc 	}
567107c0a28Sjtc 	printf("\nOkay, \"%s\".\n", wd2);
568107c0a28Sjtc 	return (2012);
569107c0a28Sjtc }
570107c0a28Sjtc 
571243d04efSjmc /* 9010                 */
572690bee10Schristos int
trtake(void)573243d04efSjmc trtake(void)
574243d04efSjmc {
57584f80fd6Slukem 	if (toting(obj))
57684f80fd6Slukem 		return (2011);	/* 9010 */
577107c0a28Sjtc 	spk = 25;
57884f80fd6Slukem 	if (obj == plant && prop[plant] <= 0)
57984f80fd6Slukem 		spk = 115;
58084f80fd6Slukem 	if (obj == bear && prop[bear] == 1)
58184f80fd6Slukem 		spk = 169;
58284f80fd6Slukem 	if (obj == chain && prop[bear] != 0)
58384f80fd6Slukem 		spk = 170;
58484f80fd6Slukem 	if (fixed[obj] != 0)
58584f80fd6Slukem 		return (2011);
58684f80fd6Slukem 	if (obj == water || obj == oil) {
5875f3ed2adShubertf 		if (here(bottle) && liq() == obj) {
58884f80fd6Slukem 			obj = bottle;
589107c0a28Sjtc 			goto l9017;
590107c0a28Sjtc 		}
591107c0a28Sjtc 		obj = bottle;
592107c0a28Sjtc 		if (toting(bottle) && prop[bottle] == 1)
593107c0a28Sjtc 			return (9220);
59484f80fd6Slukem 		if (prop[bottle] != 1)
59584f80fd6Slukem 			spk = 105;
59684f80fd6Slukem 		if (!toting(bottle))
59784f80fd6Slukem 			spk = 104;
598107c0a28Sjtc 		return (2011);
599107c0a28Sjtc 	}
600aa19a9d0Sdholland l9017:	if (holding >= 7) {
60184f80fd6Slukem 		rspeak(92);
602107c0a28Sjtc 		return (2012);
603107c0a28Sjtc 	}
60484f80fd6Slukem 	if (obj == bird) {
60584f80fd6Slukem 		if (prop[bird] != 0)
60684f80fd6Slukem 			goto l9014;
60784f80fd6Slukem 		if (toting(rod)) {
60884f80fd6Slukem 			rspeak(26);
609107c0a28Sjtc 			return (2012);
610107c0a28Sjtc 		}
61184f80fd6Slukem 		if (!toting(cage)) {	/* 9013 */
61284f80fd6Slukem 			rspeak(27);
613107c0a28Sjtc 			return (2012);
614107c0a28Sjtc 		}
615107c0a28Sjtc 		prop[bird] = 1;	/* 9015 */
616107c0a28Sjtc 	}
617107c0a28Sjtc l9014:	if ((obj == bird || obj == cage) && prop[bird] != 0)
618107c0a28Sjtc 		carry(bird + cage - obj, loc);
619107c0a28Sjtc 	carry(obj, loc);
6205f3ed2adShubertf 	k = liq();
62184f80fd6Slukem 	if (obj == bottle && k != 0)
62284f80fd6Slukem 		place[k] = -1;
623107c0a28Sjtc 	return (2009);
624107c0a28Sjtc }
625107c0a28Sjtc 
626243d04efSjmc /* 9021                 */
627c62bf84cSdholland static int
dropper(void)628243d04efSjmc dropper(void)
629243d04efSjmc {
6305f3ed2adShubertf 	k = liq();
63184f80fd6Slukem 	if (k == obj)
63284f80fd6Slukem 		obj = bottle;
63384f80fd6Slukem 	if (obj == bottle && k != 0)
63484f80fd6Slukem 		place[k] = 0;
63584f80fd6Slukem 	if (obj == cage && prop[bird] != 0)
63684f80fd6Slukem 		drop(bird, loc);
63784f80fd6Slukem 	if (obj == bird)
63884f80fd6Slukem 		prop[bird] = 0;
639107c0a28Sjtc 	drop(obj, loc);
640107c0a28Sjtc 	return (2012);
641107c0a28Sjtc }
642107c0a28Sjtc 
643243d04efSjmc /* 9020                 */
644690bee10Schristos int
trdrop(void)645243d04efSjmc trdrop(void)
646243d04efSjmc {
64784f80fd6Slukem 	if (toting(rod2) && obj == rod && !toting(rod))
64884f80fd6Slukem 		obj = rod2;
64984f80fd6Slukem 	if (!toting(obj))
65084f80fd6Slukem 		return (2011);
65184f80fd6Slukem 	if (obj == bird && here(snake)) {
65284f80fd6Slukem 		rspeak(30);
65384f80fd6Slukem 		if (closed)
65484f80fd6Slukem 			return (19000);
655aa19a9d0Sdholland 		destroy(snake);
656107c0a28Sjtc 		prop[snake] = 1;
657107c0a28Sjtc 		return (dropper());
658107c0a28Sjtc 	}
65984f80fd6Slukem 	if (obj == coins && here(vend)) {	/* 9024                 */
660aa19a9d0Sdholland 		destroy(coins);
661107c0a28Sjtc 		drop(batter, loc);
662107c0a28Sjtc 		pspeak(batter, 0);
663107c0a28Sjtc 		return (2012);
664107c0a28Sjtc 	}
66584f80fd6Slukem 	if (obj == bird && at(dragon) && prop[dragon] == 0) {	/* 9025 */
66684f80fd6Slukem 		rspeak(154);
667aa19a9d0Sdholland 		destroy(bird);
668107c0a28Sjtc 		prop[bird] = 0;
66984f80fd6Slukem 		if (place[snake] == plac[snake])
67084f80fd6Slukem 			tally2--;
671107c0a28Sjtc 		return (2012);
672107c0a28Sjtc 	}
67384f80fd6Slukem 	if (obj == bear && at(troll)) {	/* 9026                 */
67484f80fd6Slukem 		rspeak(163);
675107c0a28Sjtc 		move(troll, 0);
676107c0a28Sjtc 		move(troll + 100, 0);
677107c0a28Sjtc 		move(troll2, plac[troll]);
678107c0a28Sjtc 		move(troll2 + 100, fixd[troll]);
679107c0a28Sjtc 		juggle(chasm);
680107c0a28Sjtc 		prop[troll] = 2;
681107c0a28Sjtc 		return (dropper());
682107c0a28Sjtc 	}
68384f80fd6Slukem 	if (obj != vase || loc == plac[pillow]) { /* 9027       */
68484f80fd6Slukem 		rspeak(54);
685107c0a28Sjtc 		return (dropper());
686107c0a28Sjtc 	}
687107c0a28Sjtc 	prop[vase] = 2;		/* 9028                 */
68884f80fd6Slukem 	if (at(pillow))
68984f80fd6Slukem 		prop[vase] = 0;
690107c0a28Sjtc 	pspeak(vase, prop[vase] + 1);
69184f80fd6Slukem 	if (prop[vase] != 0)
69284f80fd6Slukem 		fixed[vase] = -1;
693107c0a28Sjtc 	return (dropper());
694107c0a28Sjtc }
695107c0a28Sjtc 
696243d04efSjmc /* 9040                 */
697690bee10Schristos int
tropen(void)698243d04efSjmc tropen(void)
699243d04efSjmc {
70084f80fd6Slukem 	if (obj == clam || obj == oyster) {
70184f80fd6Slukem 		k = 0;		/* 9046                 */
70284f80fd6Slukem 		if (obj == oyster)
70384f80fd6Slukem 			k = 1;
704107c0a28Sjtc 		spk = 124 + k;
70584f80fd6Slukem 		if (toting(obj))
70684f80fd6Slukem 			spk = 120 + k;
707aa19a9d0Sdholland 		if (!toting(trident))
70884f80fd6Slukem 			spk = 122 + k;
70984f80fd6Slukem 		if (verb == lock)
71084f80fd6Slukem 			spk = 61;
71184f80fd6Slukem 		if (spk != 124)
71284f80fd6Slukem 			return (2011);
713aa19a9d0Sdholland 		destroy(clam);
714107c0a28Sjtc 		drop(oyster, loc);
715107c0a28Sjtc 		drop(pearl, 105);
716107c0a28Sjtc 		return (2011);
717107c0a28Sjtc 	}
71884f80fd6Slukem 	if (obj == door)
71984f80fd6Slukem 		spk = 111;
72084f80fd6Slukem 	if (obj == door && prop[door] == 1)
72184f80fd6Slukem 		spk = 54;
72284f80fd6Slukem 	if (obj == cage)
72384f80fd6Slukem 		spk = 32;
72484f80fd6Slukem 	if (obj == keys)
72584f80fd6Slukem 		spk = 55;
72684f80fd6Slukem 	if (obj == grate || obj == chain)
72784f80fd6Slukem 		spk = 31;
72884f80fd6Slukem 	if (spk != 31 || !here(keys))
72984f80fd6Slukem 		return (2011);
73084f80fd6Slukem 	if (obj == chain) {
73184f80fd6Slukem 		if (verb == lock) {
73284f80fd6Slukem 			spk = 172;	/* 9049: lock           */
73384f80fd6Slukem 			if (prop[chain] != 0)
73484f80fd6Slukem 				spk = 34;
73584f80fd6Slukem 			if (loc != plac[chain])
73684f80fd6Slukem 				spk = 173;
73784f80fd6Slukem 			if (spk != 172)
73884f80fd6Slukem 				return (2011);
739107c0a28Sjtc 			prop[chain] = 2;
74084f80fd6Slukem 			if (toting(chain))
74184f80fd6Slukem 				drop(chain, loc);
742107c0a28Sjtc 			fixed[chain] = -1;
743107c0a28Sjtc 			return (2011);
744107c0a28Sjtc 		}
745107c0a28Sjtc 		spk = 171;
74684f80fd6Slukem 		if (prop[bear] == 0)
74784f80fd6Slukem 			spk = 41;
74884f80fd6Slukem 		if (prop[chain] == 0)
74984f80fd6Slukem 			spk = 37;
75084f80fd6Slukem 		if (spk != 171)
75184f80fd6Slukem 			return (2011);
752107c0a28Sjtc 		prop[chain] = 0;
753107c0a28Sjtc 		fixed[chain] = 0;
75484f80fd6Slukem 		if (prop[bear] != 3)
75584f80fd6Slukem 			prop[bear] = 2;
756107c0a28Sjtc 		fixed[bear] = 2 - prop[bear];
757107c0a28Sjtc 		return (2011);
758107c0a28Sjtc 	}
759aa19a9d0Sdholland 	if (isclosing) {
76084f80fd6Slukem 		k = 130;
76184f80fd6Slukem 		if (!panic)
76284f80fd6Slukem 			clock2 = 15;
763107c0a28Sjtc 		panic = TRUE;
764107c0a28Sjtc 		return (2010);
765107c0a28Sjtc 	}
766107c0a28Sjtc 	k = 34 + prop[grate];	/* 9043                 */
767107c0a28Sjtc 	prop[grate] = 1;
76884f80fd6Slukem 	if (verb == lock)
76984f80fd6Slukem 		prop[grate] = 0;
770107c0a28Sjtc 	k = k + 2 * prop[grate];
771107c0a28Sjtc 	return (2010);
772107c0a28Sjtc }
773107c0a28Sjtc 
774243d04efSjmc /* 9120                         */
775690bee10Schristos int
trkill(void)776243d04efSjmc trkill(void)
777243d04efSjmc {
77884f80fd6Slukem 	int     i;
779107c0a28Sjtc 	for (i = 1; i <= 5; i++)
78084f80fd6Slukem 		if (dloc[i] == loc && dflag >= 2)
78184f80fd6Slukem 			break;
78284f80fd6Slukem 	if (i == 6)
78384f80fd6Slukem 		i = 0;
78484f80fd6Slukem 	if (obj == 0) {		/* 9122                         */
78584f80fd6Slukem 		if (i != 0)
78684f80fd6Slukem 			obj = dwarf;
78784f80fd6Slukem 		if (here(snake))
78884f80fd6Slukem 			obj = obj * 100 + snake;
78984f80fd6Slukem 		if (at(dragon) && prop[dragon] == 0)
79084f80fd6Slukem 			obj = obj * 100 + dragon;
79184f80fd6Slukem 		if (at(troll))
79284f80fd6Slukem 			obj = obj * 100 + troll;
79384f80fd6Slukem 		if (here(bear) && prop[bear] == 0)
79484f80fd6Slukem 			obj = obj * 100 + bear;
79584f80fd6Slukem 		if (obj > 100)
79684f80fd6Slukem 			return (8000);
79784f80fd6Slukem 		if (obj == 0) {
79884f80fd6Slukem 			if (here(bird) && verb != throw)
79984f80fd6Slukem 				obj = bird;
80084f80fd6Slukem 			if (here(clam) || here(oyster))
80184f80fd6Slukem 				obj = 100 * obj + clam;
80284f80fd6Slukem 			if (obj > 100)
80384f80fd6Slukem 				return (8000);
804107c0a28Sjtc 		}
805107c0a28Sjtc 	}
80684f80fd6Slukem 	if (obj == bird) {	/* 9124                         */
80784f80fd6Slukem 		spk = 137;
80884f80fd6Slukem 		if (closed)
80984f80fd6Slukem 			return (2011);
810aa19a9d0Sdholland 		destroy(bird);
811107c0a28Sjtc 		prop[bird] = 0;
81284f80fd6Slukem 		if (place[snake] == plac[snake])
81384f80fd6Slukem 			tally2++;
814107c0a28Sjtc 		spk = 45;
815107c0a28Sjtc 	}
81684f80fd6Slukem 	if (obj == 0)
81784f80fd6Slukem 		spk = 44;	/* 9125                         */
81884f80fd6Slukem 	if (obj == clam || obj == oyster)
81984f80fd6Slukem 		spk = 150;
82084f80fd6Slukem 	if (obj == snake)
82184f80fd6Slukem 		spk = 46;
82284f80fd6Slukem 	if (obj == dwarf)
82384f80fd6Slukem 		spk = 49;
82484f80fd6Slukem 	if (obj == dwarf && closed)
82584f80fd6Slukem 		return (19000);
82684f80fd6Slukem 	if (obj == dragon)
82784f80fd6Slukem 		spk = 147;
82884f80fd6Slukem 	if (obj == troll)
82984f80fd6Slukem 		spk = 157;
83084f80fd6Slukem 	if (obj == bear)
83184f80fd6Slukem 		spk = 165 + (prop[bear] + 1) / 2;
83284f80fd6Slukem 	if (obj != dragon || prop[dragon] != 0)
83384f80fd6Slukem 		return (2011);
834107c0a28Sjtc 	rspeak(49);
835107c0a28Sjtc 	verb = 0;
836107c0a28Sjtc 	obj = 0;
837107c0a28Sjtc 	getin(&wd1, &wd2);
83884f80fd6Slukem 	if (!weq(wd1, "y") && !weq(wd1, "yes"))
83984f80fd6Slukem 		return (2608);
840107c0a28Sjtc 	pspeak(dragon, 1);
841107c0a28Sjtc 	prop[dragon] = 2;
842107c0a28Sjtc 	prop[rug] = 0;
843107c0a28Sjtc 	k = (plac[dragon] + fixd[dragon]) / 2;
844107c0a28Sjtc 	move(dragon + 100, -1);
845107c0a28Sjtc 	move(rug + 100, 0);
846107c0a28Sjtc 	move(dragon, k);
847107c0a28Sjtc 	move(rug, k);
848107c0a28Sjtc 	for (obj = 1; obj <= 100; obj++)
849107c0a28Sjtc 		if (place[obj] == plac[dragon] || place[obj] == fixd[dragon])
850107c0a28Sjtc 			move(obj, k);
851107c0a28Sjtc 	loc = k;
852107c0a28Sjtc 	k = null;
853107c0a28Sjtc 	return (8);
854107c0a28Sjtc }
855107c0a28Sjtc 
856243d04efSjmc /* 9170: throw                  */
857690bee10Schristos int
trtoss(void)858243d04efSjmc trtoss(void)
859243d04efSjmc {
86084f80fd6Slukem 	int     i;
86184f80fd6Slukem 	if (toting(rod2) && obj == rod && !toting(rod))
86284f80fd6Slukem 		obj = rod2;
86384f80fd6Slukem 	if (!toting(obj))
86484f80fd6Slukem 		return (2011);
86584f80fd6Slukem 	if (obj >= 50 && obj <= maxtrs && at(troll)) {
86684f80fd6Slukem 		spk = 159;	/* 9178                 */
867107c0a28Sjtc 		drop(obj, 0);
868107c0a28Sjtc 		move(troll, 0);
869107c0a28Sjtc 		move(troll + 100, 0);
870107c0a28Sjtc 		drop(troll2, plac[troll]);
871107c0a28Sjtc 		drop(troll2 + 100, fixd[troll]);
872107c0a28Sjtc 		juggle(chasm);
873107c0a28Sjtc 		return (2011);
874107c0a28Sjtc 	}
87584f80fd6Slukem 	if (obj == food && here(bear)) {
87684f80fd6Slukem 		obj = bear;	/* 9177                 */
877107c0a28Sjtc 		return (9210);
878107c0a28Sjtc 	}
87984f80fd6Slukem 	if (obj != axe)
88084f80fd6Slukem 		return (9020);
88184f80fd6Slukem 	for (i = 1; i <= 5; i++) {
88284f80fd6Slukem 		if (dloc[i] == loc) {
88384f80fd6Slukem 			spk = 48;	/* 9172                 */
884107c0a28Sjtc 			if (ran(3) == 0 || saved != -1)
88584f80fd6Slukem 	l9175:		{
88684f80fd6Slukem 				rspeak(spk);
887107c0a28Sjtc 				drop(axe, loc);
888107c0a28Sjtc 				k = null;
889107c0a28Sjtc 				return (8);
890107c0a28Sjtc 			}
891107c0a28Sjtc 			dseen[i] = FALSE;
892107c0a28Sjtc 			dloc[i] = 0;
893107c0a28Sjtc 			spk = 47;
894107c0a28Sjtc 			dkill++;
89584f80fd6Slukem 			if (dkill == 1)
89684f80fd6Slukem 				spk = 149;
897107c0a28Sjtc 			goto l9175;
898107c0a28Sjtc 		}
899107c0a28Sjtc 	}
900107c0a28Sjtc 	spk = 152;
901107c0a28Sjtc 	if (at(dragon) && prop[dragon] == 0)
902107c0a28Sjtc 		goto l9175;
903107c0a28Sjtc 	spk = 158;
90484f80fd6Slukem 	if (at(troll))
90584f80fd6Slukem 		goto l9175;
90684f80fd6Slukem 	if (here(bear) && prop[bear] == 0) {
90784f80fd6Slukem 		spk = 164;
908107c0a28Sjtc 		drop(axe, loc);
909107c0a28Sjtc 		fixed[axe] = -1;
910107c0a28Sjtc 		prop[axe] = 1;
911107c0a28Sjtc 		juggle(bear);
912107c0a28Sjtc 		return (2011);
913107c0a28Sjtc 	}
914107c0a28Sjtc 	obj = 0;
915107c0a28Sjtc 	return (9120);
916107c0a28Sjtc }
917107c0a28Sjtc 
918243d04efSjmc /* 9210                 */
919690bee10Schristos int
trfeed(void)920243d04efSjmc trfeed(void)
921243d04efSjmc {
92284f80fd6Slukem 	if (obj == bird) {
92384f80fd6Slukem 		spk = 100;
924107c0a28Sjtc 		return (2011);
925107c0a28Sjtc 	}
92684f80fd6Slukem 	if (obj == snake || obj == dragon || obj == troll) {
92784f80fd6Slukem 		spk = 102;
92884f80fd6Slukem 		if (obj == dragon && prop[dragon] != 0)
92984f80fd6Slukem 			spk = 110;
93084f80fd6Slukem 		if (obj == troll)
93184f80fd6Slukem 			spk = 182;
93284f80fd6Slukem 		if (obj != snake || closed || !here(bird))
93384f80fd6Slukem 			return (2011);
934107c0a28Sjtc 		spk = 101;
935aa19a9d0Sdholland 		destroy(bird);
936107c0a28Sjtc 		prop[bird] = 0;
937107c0a28Sjtc 		tally2++;
938107c0a28Sjtc 		return (2011);
939107c0a28Sjtc 	}
94084f80fd6Slukem 	if (obj == dwarf) {
94184f80fd6Slukem 		if (!here(food))
94284f80fd6Slukem 			return (2011);
943107c0a28Sjtc 		spk = 103;
944107c0a28Sjtc 		dflag++;
945107c0a28Sjtc 		return (2011);
946107c0a28Sjtc 	}
94784f80fd6Slukem 	if (obj == bear) {
94884f80fd6Slukem 		if (prop[bear] == 0)
94984f80fd6Slukem 			spk = 102;
95084f80fd6Slukem 		if (prop[bear] == 3)
95184f80fd6Slukem 			spk = 110;
95284f80fd6Slukem 		if (!here(food))
95384f80fd6Slukem 			return (2011);
954aa19a9d0Sdholland 		destroy(food);
955107c0a28Sjtc 		prop[bear] = 1;
956107c0a28Sjtc 		fixed[axe] = 0;
957107c0a28Sjtc 		prop[axe] = 0;
958107c0a28Sjtc 		spk = 168;
959107c0a28Sjtc 		return (2011);
960107c0a28Sjtc 	}
961107c0a28Sjtc 	spk = 14;
962107c0a28Sjtc 	return (2011);
963107c0a28Sjtc }
964107c0a28Sjtc 
965243d04efSjmc /* 9220 */
966690bee10Schristos int
trfill(void)967243d04efSjmc trfill(void)
968243d04efSjmc {
96984f80fd6Slukem 	if (obj == vase) {
97084f80fd6Slukem 		spk = 29;
97184f80fd6Slukem 		if (liqloc(loc) == 0)
97284f80fd6Slukem 			spk = 144;
97384f80fd6Slukem 		if (liqloc(loc) == 0 || !toting(vase))
97484f80fd6Slukem 			return (2011);
975107c0a28Sjtc 		rspeak(145);
976107c0a28Sjtc 		prop[vase] = 2;
977107c0a28Sjtc 		fixed[vase] = -1;
978107c0a28Sjtc 		return (9020);	/* advent/10 goes to 9024 */
979107c0a28Sjtc 	}
98084f80fd6Slukem 	if (obj != 0 && obj != bottle)
98184f80fd6Slukem 		return (2011);
98284f80fd6Slukem 	if (obj == 0 && !here(bottle))
98384f80fd6Slukem 		return (8000);
984107c0a28Sjtc 	spk = 107;
98584f80fd6Slukem 	if (liqloc(loc) == 0)
98684f80fd6Slukem 		spk = 106;
9875f3ed2adShubertf 	if (liq() != 0)
98884f80fd6Slukem 		spk = 105;
98984f80fd6Slukem 	if (spk != 107)
99084f80fd6Slukem 		return (2011);
991107c0a28Sjtc 	prop[bottle] = ((cond[loc] % 4) / 2) * 2;
9925f3ed2adShubertf 	k = liq();
99384f80fd6Slukem 	if (toting(bottle))
99484f80fd6Slukem 		place[k] = -1;
99584f80fd6Slukem 	if (k == oil)
99684f80fd6Slukem 		spk = 108;
997107c0a28Sjtc 	return (2011);
998107c0a28Sjtc }
999107c0a28Sjtc 
1000243d04efSjmc /* 10000 */
1001dd397c84Shubertf void
closing(void)1002243d04efSjmc closing(void)
1003243d04efSjmc {
100484f80fd6Slukem 	int     i;
1005107c0a28Sjtc 
1006aa19a9d0Sdholland 	prop[grate] = prop[fissure] = 0;
100784f80fd6Slukem 	for (i = 1; i <= 6; i++) {
100884f80fd6Slukem 		dseen[i] = FALSE;
1009107c0a28Sjtc 		dloc[i] = 0;
1010107c0a28Sjtc 	}
1011107c0a28Sjtc 	move(troll, 0);
1012107c0a28Sjtc 	move(troll + 100, 0);
1013107c0a28Sjtc 	move(troll2, plac[troll]);
1014107c0a28Sjtc 	move(troll2 + 100, fixd[troll]);
1015107c0a28Sjtc 	juggle(chasm);
101684f80fd6Slukem 	if (prop[bear] != 3)
1017aa19a9d0Sdholland 		destroy(bear);
1018107c0a28Sjtc 	prop[chain] = 0;
1019107c0a28Sjtc 	fixed[chain] = 0;
1020107c0a28Sjtc 	prop[axe] = 0;
1021107c0a28Sjtc 	fixed[axe] = 0;
1022107c0a28Sjtc 	rspeak(129);
1023107c0a28Sjtc 	clock1 = -1;
1024aa19a9d0Sdholland 	isclosing = TRUE;
1025107c0a28Sjtc }
1026107c0a28Sjtc 
1027243d04efSjmc /* 11000 */
1028dd397c84Shubertf void
caveclose(void)1029243d04efSjmc caveclose(void)
1030243d04efSjmc {
103184f80fd6Slukem 	int     i;
1032107c0a28Sjtc 	prop[bottle] = put(bottle, 115, 1);
1033107c0a28Sjtc 	prop[plant] = put(plant, 115, 0);
1034107c0a28Sjtc 	prop[oyster] = put(oyster, 115, 0);
1035107c0a28Sjtc 	prop[lamp] = put(lamp, 115, 0);
1036107c0a28Sjtc 	prop[rod] = put(rod, 115, 0);
1037107c0a28Sjtc 	prop[dwarf] = put(dwarf, 115, 0);
1038107c0a28Sjtc 	loc = 115;
1039107c0a28Sjtc 	oldloc = 115;
1040107c0a28Sjtc 	newloc = 115;
1041107c0a28Sjtc 
1042107c0a28Sjtc 	put(grate, 116, 0);
1043107c0a28Sjtc 	prop[snake] = put(snake, 116, 1);
1044107c0a28Sjtc 	prop[bird] = put(bird, 116, 1);
1045107c0a28Sjtc 	prop[cage] = put(cage, 116, 0);
1046107c0a28Sjtc 	prop[rod2] = put(rod2, 116, 0);
1047107c0a28Sjtc 	prop[pillow] = put(pillow, 116, 0);
1048107c0a28Sjtc 
1049107c0a28Sjtc 	prop[mirror] = put(mirror, 115, 0);
1050107c0a28Sjtc 	fixed[mirror] = 116;
1051107c0a28Sjtc 
1052107c0a28Sjtc 	for (i = 1; i <= 100; i++)
105384f80fd6Slukem 		if (toting(i))
1054aa19a9d0Sdholland 			destroy(i);
1055107c0a28Sjtc 	rspeak(132);
1056107c0a28Sjtc 	closed = TRUE;
1057107c0a28Sjtc }
1058