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