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