1/*	$OpenBSD: main.c,v 1.26 2021/01/27 01:59:39 deraadt Exp $	*/
2/*	$NetBSD: main.c,v 1.5 1996/05/21 21:53:09 mrg Exp $	*/
3
4/*-
5 * Copyright (c) 1991, 1993
6 *	The Regents of the University of California.  All rights reserved.
7 *
8 * The game adventure was originally written in Fortran by Will Crowther
9 * and Don Woods.  It was later translated to C and enhanced by Jim
10 * Gillogly.  This code is derived from software contributed to Berkeley
11 * by Jim Gillogly at The Rand Corporation.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 *    notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 *    notice, this list of conditions and the following disclaimer in the
20 *    documentation and/or other materials provided with the distribution.
21 * 3. Neither the name of the University nor the names of its contributors
22 *    may be used to endorse or promote products derived from this software
23 *    without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * SUCH DAMAGE.
36 */
37
38/*	Re-coding of advent in C: main program				*/
39
40#include <err.h>
41#include <stdio.h>
42#include <time.h>
43#include <unistd.h>
44
45#include "extern.h"
46#include "hdr.h"
47
48int     datfd;			/* message file descriptor	*/
49volatile sig_atomic_t delhit;
50int     yea;
51
52int     loc, newloc, oldloc, oldlc2, wzdark, gaveup, kq, k, k2;
53int     verb, obj, spk;
54time_t  savet;
55int     mxscor, latncy;
56
57char	wd1[MAXSTR];		/* the complete words		*/
58char	wd2[MAXSTR];
59
60struct hashtab voc[HTSIZE];
61
62struct text rtext[RTXSIZ];	/* random text messages		*/
63
64struct text mtext[MAGSIZ];	/* magic messages		*/
65
66int clsses;
67struct text ctext[CLSMAX];	/* classes of adventurer	*/
68int cval[CLSMAX];
69
70struct text ptext[101];		/* object descriptions		*/
71
72struct text ltext[LOCSIZ];	/* long loc description		*/
73struct text stext[LOCSIZ];	/* short loc descriptions	*/
74
75struct travlist *travel[LOCSIZ],*tkk;	/* travel is closer to keys(...)*/
76
77int atloc[LOCSIZ];
78
79int	plac[101];		/* initial object placement	*/
80int	fixd[101], fixed[101];	/* location fixed?		*/
81
82int	actspk[35];		/* rtext msg for verb <n>	*/
83
84int	cond[LOCSIZ];		/* various condition bits	*/
85
86int	hntmax;
87int	hints[20][5];		/* info on hints		*/
88int	hinted[20], hintlc[20];
89
90int	place[101], prop[101], linkx[201];
91int	abb[LOCSIZ];
92
93int	maxtrs, tally, tally2;	/* treasure values		*/
94
95int	keys, lamp, grate, cage, rod, rod2, steps,	/* mnemonics */
96	bird, door, pillow, snake, fissur, tablet, clam, oyster,
97	magzin, dwarf, knife, food, bottle, water, oil, plant, plant2,
98	axe, mirror, dragon, chasm, troll, troll2, bear, messag,
99	vend, batter, nugget, coins, chest, eggs, tridnt, vase,
100	emrald, pyram, pearl, rug, chain, spices, back, look, cave,
101	null, entrnc, dprssn, enter, stream, pour, say, lock, throw,
102	find, invent;
103
104int	chloc, chloc2, dseen[7], dloc[7],	/* dwarf stuff	*/
105	odloc[7], dflag, daltlc;
106
107int	tk[21], stick, dtotal, attack;
108int	turns, lmwarn, iwest, knfloc, detail,   /* various flags & counters */
109	abbnum, maxdie, numdie, holdng, dkill, foobar, bonus, clock1,
110	clock2, saved, closng, panic, closed, scorng;
111
112int	demo, limit;
113
114int
115main(int argc, char *argv[])
116{
117	int     i;
118	int     rval, ll;
119	struct text *kk;
120
121	if (pledge("stdio rpath wpath cpath", NULL) == -1)
122		err(1, "pledge");
123
124	init();		/* Initialize everything */
125	signal(SIGINT, trapdel);
126
127	if (argc > 1) {	/* Restore file specified */
128		/* Restart is label 8305 (Fortran) */
129		i = restore(argv[1]);	/* See what we've got */
130		switch (i) {
131		case 0:			/* The restore worked fine */
132			yea = Start();
133			k = null;
134			unlink(argv[1]);/* Don't re-use the save */
135			goto l8;	/* Get where we're going */
136		case 1:		/* Couldn't open it */
137			errx(1, "can't open file");	/* So give up */
138		case 2:		/* Oops -- file was altered */
139			rspeak(202);	/* You dissolve */
140			return 2;	/* File could be non-adventure */
141		}			/* So don't unlink it. */
142	}
143
144	startup();		/* prepare for a user		*/
145
146	for (;;) {		/* main command loop (label 2)	*/
147		if (newloc < 9 && newloc != 0 && closng) {
148			rspeak(130);	/* if closing leave only by	*/
149			newloc = loc;	/*	main office		*/
150			if (!panic)
151				clock2 = 15;
152			panic = TRUE;
153		}
154
155		rval = fdwarf();		/* dwarf stuff			*/
156		if (rval == 99)
157			die(99);
158
159l2000:		if (loc == 0)
160			die(99);	/* label 2000			*/
161		kk = &stext[loc];
162		if ((abb[loc] % abbnum) ==0 || kk->seekadr == 0)
163			kk = &ltext[loc];
164		if (!forced(loc) && dark()) {
165			if (wzdark && pct(35)) {
166				die(90);
167				goto l2000;
168			}
169			kk = &rtext[16];
170		}
171		if (toting(bear))
172			rspeak(141);	/* 2001			*/
173		speak(kk);
174		k = 1;
175		if (forced(loc))
176			goto l8;
177		if (loc == 33 && pct(25) && !closng)
178			rspeak(8);
179		if (!dark()) {
180			abb[loc]++;
181			for (i = atloc[loc]; i != 0; i = linkx[i]) {	/*2004*/
182				obj = i;
183				if (obj > 100)
184					obj -= 100;
185				if (obj == steps && toting(nugget))
186					continue;
187				if (prop[obj] < 0) {
188					if (closed)
189						continue;
190					prop[obj] = 0;
191					if (obj == rug || obj == chain)
192						prop[obj] = 1;
193					tally--;
194					if (tally == tally2 && tally != 0)
195						if (limit > 35)
196							limit = 35;
197				}
198				ll = prop[obj];	/* 2006	*/
199				if (obj == steps && loc == fixed[steps])
200					ll = 1;
201				pspeak(obj, ll);
202			}		/* 2008 */
203			goto l2012;
204l2009:		k = 54;			/* 2009			*/
205l2010:		spk = k;
206l2011:		rspeak(spk);
207		}
208l2012:		verb = 0;		/* 2012			*/
209		obj = 0;
210l2600:		checkhints();		/* to 2600-2602		*/
211		if (closed) {
212			if (prop[oyster] < 0 && toting(oyster))
213				pspeak(oyster, 1);
214			for (i = 1; i < 100; i++)
215				if (toting(i) && prop[i] < 0)	/* 2604 */
216					prop[i] = -1 - prop[i];
217		}
218		wzdark = dark();	/* 2605			*/
219		if (knfloc > 0 && knfloc != loc)
220			knfloc = 1;
221		getin(wd1, sizeof(wd1), wd2, sizeof(wd2));
222		if (delhit) {		/* user typed a DEL	*/
223			delhit = 0;	/* reset counter	*/
224			/* pretend he's quitting */
225			strlcpy(wd1, "quit", sizeof(wd1));
226			wd2[0] = 0;
227		}
228l2608:		if ((foobar = -foobar) > 0)
229			foobar = 0;	/* 2608		*/
230		/* should check here for "magic mode"		*/
231		turns++;
232		if (demo && turns >= SHORT)
233			done(1);	/* to 13000	*/
234
235		if (verb == say && wd2[0] != 0)
236			verb = 0;
237		if (verb == say)
238			goto l4090;
239		if (tally == 0 && loc >= 15 && loc != 33)
240			clock1--;
241		if (clock1 == 0) {
242			closing();			/* to 10000	*/
243			goto l19999;
244		}
245		if (clock1 < 0)
246			clock2--;
247		if (clock2 == 0) {
248			caveclose();		/* to 11000		*/
249			continue;		/* back to 2		*/
250		}
251		if (prop[lamp] == 1)
252			limit--;
253		if (limit <= 30 && here(batter) && prop[batter] == 0
254			&& here(lamp)) {
255			rspeak(188);		/* 12000		*/
256			prop[batter] = 1;
257			if (toting(batter))
258				drop(batter, loc);
259			limit += 2500;
260			lmwarn = FALSE;
261			goto l19999;
262		}
263		if (limit == 0) {
264			limit = -1;		/* 12400		*/
265			prop[lamp] = 0;
266			rspeak(184);
267			goto l19999;
268		}
269		if (limit < 0 && loc <= 8) {
270			rspeak(185);		/* 12600		*/
271			gaveup = TRUE;
272			done(2);		/* to 20000		*/
273		}
274		if (limit <= 30) {
275			if (lmwarn || !here(lamp))
276				goto l19999;	/*12200*/
277			lmwarn = TRUE;
278			spk = 187;
279			if (place[batter] == 0)
280				spk = 183;
281			if (prop[batter] == 1)
282				spk = 189;
283			rspeak(spk);
284		}
285l19999:		k = 43;
286		if (liqloc(loc) == water)
287			k = 70;
288		if (weq(wd1, "enter") &&
289		    (weq(wd2, "strea") || weq(wd2, "water")))
290			goto l2010;
291		if (weq(wd1, "enter") && *wd2 != 0)
292			goto l2800;
293		if ((!weq(wd1, "water") && !weq(wd1, "oil"))
294		    || (!weq(wd2, "plant") && !weq(wd2, "door")))
295			goto l2610;
296		if (at(vocab(wd2, 1, 0)))
297			strlcpy(wd2, "pour", sizeof(wd2));
298
299l2610:		if (weq(wd1, "west"))
300			if (++iwest == 10)
301				rspeak(17);
302l2630:		i = vocab(wd1, -1, 0);
303		if (i== -1) {
304			spk = 60;			/* 3000		*/
305			if (pct(20))
306				spk = 61;
307			if (pct(20))
308				spk = 13;
309			rspeak(spk);
310			goto l2600;
311		}
312		k = i % 1000;
313		kq = i / 1000 + 1;
314		switch (kq) {
315		case 1: goto l8;
316		case 2: goto l5000;
317		case 3: goto l4000;
318		case 4: goto l2010;
319		default:
320			bug(22);
321		}
322
323l8:
324		switch (march()) {
325		case 2: continue;		/* i.e. goto l2		*/
326		case 99:
327			die(99);
328			goto l2000;
329		default: bug(110);
330		}
331
332l2800:		strlcpy(wd1, wd2, sizeof(wd1));
333		wd2[0] = 0;
334		goto l2610;
335
336l4000:		verb = k;
337		spk = actspk[verb];
338		if (wd2[0] != 0 && verb != say)
339			goto l2800;
340		if (verb == say)
341			obj = wd2[0];
342		if (obj != 0)
343			goto l4090;
344
345		switch (verb) {
346		case 1:			/* take = 8010		*/
347			if (atloc[loc] == 0 || linkx[atloc[loc]] != 0)
348				goto l8000;
349			for (i = 1; i <= 5; i++)
350				if (dloc[i] == loc && dflag >= 2)
351					goto l8000;
352			obj = atloc[loc];
353			goto l9010;
354		case 2: case 3: case 9:		/* 8000 : drop, say, wave */
355		case 10: case 16: case 17:	/* calm, rub, toss	*/
356		case 19: case 21: case 28:	/* find, feed, break	*/
357		case 29:			/* wake			*/
358l8000:			printf("%s what?\n", wd1);
359			obj = 0;
360			goto l2600;
361		case 4: case 6:		/* 8040 open, lock	*/
362			spk = 28;
363			if (here(clam))
364				obj = clam;
365			if (here(oyster))
366				obj = oyster;
367			if (at(door))
368				obj = door;
369			if (at(grate))
370				obj = grate;
371			if (obj != 0 && here(chain))
372				goto l8000;
373			if (here(chain))
374				obj = chain;
375			if (obj == 0)
376				goto l2011;
377			goto l9040;
378		case 5: goto l2009;		/* nothing		*/
379		case 7: goto l9070;		/* on			*/
380		case 8: goto l9080;		/* off			*/
381		case 11: goto l8000;	/* walk			*/
382		case 12: goto l9120;	/* kill			*/
383		case 13: goto l9130;	/* pour			*/
384		case 14:			/* eat: 8140		*/
385			if (!here(food))
386				goto l8000;
387l8142:			dstroy(food);
388			spk = 72;
389			goto l2011;
390		case 15: goto l9150;	/* drink		*/
391		case 18:			/* quit: 8180		*/
392			gaveup = yes(22, 54, 54);
393			if (gaveup)
394				done(2);	/* 8185			*/
395			goto l2012;
396		case 20:			/* invent = 8200	*/
397			spk = 98;
398			for (i = 1; i <= 100; i++) {
399				if (i != bear && toting(i)) {
400					if (spk == 98)
401						rspeak(99);
402					blklin = FALSE;
403					pspeak(i, -1);
404					blklin = TRUE;
405					spk = 0;
406				}
407			}
408			if (toting(bear))
409				spk = 141;
410			goto l2011;
411		case 22: goto l9220;	/* fill			*/
412		case 23: goto l9230;	/* blast		*/
413		case 24:			/* score: 8240		*/
414			scorng = TRUE;
415			printf("If you were to quit now, you would score");
416			printf(" %d out of a possible ", score());
417			printf("%d.", mxscor);
418			scorng = FALSE;
419			gaveup = yes(143, 54, 54);
420			if (gaveup)
421				done(2);
422			goto l2012;
423		case 25:			/* foo: 8250		*/
424			k = vocab(wd1, 3, 0);
425			spk = 42;
426			if (foobar == 1 - k)
427				goto l8252;
428			if (foobar != 0)
429				spk = 151;
430			goto l2011;
431l8252:			foobar = k;
432			if (k != 4)
433				goto l2009;
434			foobar = 0;
435			if (place[eggs] == plac[eggs]
436				|| (toting(eggs) && loc == plac[eggs])) goto l2011;
437			if (place[eggs] == 0 && place[troll] == 0 && prop[troll] == 0)
438				prop[troll] = 1;
439			k = 2;
440			if (here(eggs))
441				k = 1;
442			if (loc == plac[eggs])
443				k = 0;
444			move(eggs, plac[eggs]);
445			pspeak(eggs, k);
446			goto l2012;
447		case 26:			/* brief = 8260		*/
448			spk = 156;
449			abbnum = 10000;
450			detail = 3;
451			goto l2011;
452		case 27:			/* read = 8270		*/
453			if (here(magzin))
454				obj = magzin;
455			if (here(tablet))
456				obj = obj * 100 + tablet;
457			if (here(messag))
458				obj = obj * 100 + messag;
459			if (closed && toting(oyster))
460				obj = oyster;
461			if (obj > 100 || obj == 0 || dark())
462				goto l8000;
463			goto l9270;
464		case 30:			/* suspend = 8300	*/
465			spk = 201;
466			if (demo)
467				goto l2011;
468			printf("I can suspend your adventure for you so");
469			printf(" you can resume later, but\n");
470			printf("you will have to wait at least");
471			printf(" %d minutes before continuing.", latncy);
472			if (!yes(200, 54, 54))
473				goto l2012;
474			time(&savet);
475			ciao();		/* Do we quit? */
476			continue;		/* Maybe not */
477		case 31:			/* hours = 8310		*/
478			printf("Colossal cave is closed 9am-5pm Mon ");
479			printf("through Fri except holidays.\n");
480			goto l2012;
481		default:
482			bug(23);
483		}
484
485l4090:
486		switch (verb) {
487		case 1:			/* take = 9010		*/
488l9010:			switch (trtake()) {
489			case 2011: goto l2011;
490			case 9220: goto l9220;
491			case 2009: goto l2009;
492			case 2012: goto l2012;
493			default: bug(102);
494			}
495l9020:		case 2:			/* drop = 9020		*/
496			switch (trdrop()) {
497			case 2011: goto l2011;
498			case 19000: done(3);
499			case 2012: goto l2012;
500			default: bug(105);
501			}
502		case 3:
503			switch (trsay()) {
504			case 2012: goto l2012;
505			case 2630: goto l2630;
506			default: bug(107);
507			}
508l9040:		case 4: case 6:		/* open, close		*/
509			switch (tropen()) {
510			case 2011: goto l2011;
511			case 2010: goto l2010;
512			default: bug(106);
513			}
514		case 5: goto l2009;	/* nothing		*/
515		case 7:			/* on	9070		*/
516l9070:			if (!here(lamp))
517				goto l2011;
518			spk = 184;
519			if (limit < 0)
520				goto l2011;
521			prop[lamp] = 1;
522			rspeak(39);
523			if (wzdark)
524				goto l2000;
525			goto l2012;
526
527		case 8:			/* off			*/
528l9080:			if (!here(lamp))
529				goto l2011;
530			prop[lamp] = 0;
531			rspeak(40);
532			if (dark())
533				rspeak(16);
534			goto l2012;
535
536		case 9:			/* wave			*/
537			if ((!toting(obj)) && (obj != rod || !toting(rod2)))
538				spk = 29;
539			if (obj != rod || !at(fissur)||!toting(obj) || closng)
540				goto l2011;
541			prop[fissur] = 1-prop[fissur];
542			pspeak(fissur, 2-prop[fissur]);
543			goto l2012;
544		case 10: case 11: case 18:	/* calm, walk, quit	*/
545		case 24: case 25: case 26:	/* score, foo, brief	*/
546		case 30: case 31:		/* suspend, hours	*/
547			goto l2011;
548l9120:		case 12:			/* kill			*/
549			switch (trkill()) {
550			case 8000: goto l8000;
551			case 8: goto l8;
552			case 2011: goto l2011;
553			case 2608: goto l2608;
554			case 19000: done(3);
555			default: bug(112);
556			}
557l9130:		case 13:			/* pour			*/
558			if (obj == bottle || obj == 0)
559				obj = liq();
560			if (obj == 0)
561				goto l8000;
562			if (!toting(obj))
563				goto l2011;
564			spk = 78;
565			if (obj != oil && obj != water)
566				goto l2011;
567			prop[bottle] = 1;
568			place[obj] = 0;
569			spk = 77;
570			if (!(at(plant) || at(door)))
571				goto l2011;
572			if (at(door)) {
573				prop[door] = 0;	/* 9132			*/
574				if (obj == oil)
575					prop[door] = 1;
576				spk = 113 + prop[door];
577				goto l2011;
578			}
579			spk = 112;
580			if (obj != water)
581				goto l2011;
582			pspeak(plant, prop[plant] + 1);
583			prop[plant] = (prop[plant] + 2) % 6;
584			prop[plant2] = prop[plant] / 2;
585			k = null;
586			goto l8;
587		case 14:			/* 9140 - eat		*/
588			if (obj == food)
589				goto l8142;
590			if (obj == bird || obj == snake || obj == clam || obj == oyster
591			    || obj == dwarf || obj == dragon || obj == troll
592			    || obj == bear) spk = 71;
593			goto l2011;
594l9150:		case 15:			/* 9150 - drink		*/
595			if (obj == 0 && liqloc(loc) != water && (liq() != water
596				|| !here(bottle)))
597				goto l8000;
598			if (obj != 0 && obj != water)
599				spk = 110;
600			if (spk == 110 || liq() != water || !here(bottle))
601				goto l2011;
602			prop[bottle] = 1;
603			place[water] = 0;
604			spk = 74;
605			goto l2011;
606		case 16:			/* 9160: rub		*/
607			if (obj != lamp)
608				spk = 76;
609			goto l2011;
610		case 17:			/* 9170: throw		*/
611			switch (trtoss()) {
612			case 2011: goto l2011;
613			case 9020: goto l9020;
614			case 9120: goto l9120;
615			case 8: goto l8;
616			case 9210: goto l9210;
617			default: bug(113);
618			}
619		case 19: case 20:		/* 9190: find, invent	*/
620			if (at(obj) || (liq() == obj && at(bottle))
621				|| k == liqloc(loc))
622				spk = 94;
623			for (i = 1; i <= 5; i++)
624				if (dloc[i] == loc && dflag >= 2 && obj == dwarf)
625					spk = 94;
626			if (closed)
627				spk = 138;
628			if (toting(obj))
629				spk = 24;
630			goto l2011;
631l9210:		case 21:			/* feed			*/
632			switch (trfeed()) {
633			case 2011: goto l2011;
634			default: bug(114);
635			}
636l9220:		case 22:			/* fill			*/
637			switch (trfill()) {
638			case 2011: goto l2011;
639			case 8000: goto l8000;
640			case 9020: goto l9020;
641			default: bug(115);
642			}
643l9230:		case 23:			/* blast		*/
644			if (prop[rod2] < 0 || !closed)
645				goto l2011;
646			bonus = 133;
647			if (loc == 115)
648				bonus = 134;
649			if (here(rod2))
650				bonus = 135;
651			rspeak(bonus);
652			done(2);
653l9270:		case 27:			/* read			*/
654			if (dark())
655				goto l5190;
656			if (obj == magzin)
657				spk = 190;
658			if (obj == tablet)
659				spk = 196;
660			if (obj == messag)
661				spk = 191;
662			if (obj == oyster && hinted[2] && toting(oyster))
663				spk = 194;
664			if (obj != oyster || hinted[2] || !toting(oyster)
665				|| !closed) goto l2011;
666			hinted[2] = yes(192, 193, 54);
667			goto l2012;
668		case 28:			/* break		*/
669			if (obj == mirror)
670				spk = 148;
671			if (obj == vase && prop[vase] == 0) {
672				spk = 198;
673				if (toting(vase))
674					drop(vase, loc);
675				prop[vase] = 2;
676				fixed[vase] = -1;
677				goto l2011;
678			}
679			if (obj != mirror||!closed)
680				goto l2011;
681			rspeak(197);
682			done(3);
683		case 29:			/* wake			*/
684			if (obj != dwarf||!closed)
685				goto l2011;
686			rspeak(199);
687			done(3);
688
689		default: bug(24);
690		}
691
692l5000:
693		obj = k;
694		if (fixed[k] != loc && !here(k))
695			goto l5100;
696l5010:		if (wd2[0] != 0)
697			goto l2800;
698		if (verb != 0)
699			goto l4090;
700		printf("What do you want to do with the %s?\n", wd1);
701		goto l2600;
702l5100:		if (k != grate)
703			goto l5110;
704		if (loc == 1 || loc == 4 || loc == 7)
705			k = dprssn;
706		if (loc > 9 && loc < 15)
707			k = entrnc;
708		if (k != grate)
709			goto l8;
710l5110:		if (k != dwarf)
711			goto l5120;
712		for (i = 1; i <= 5; i++)
713			if (dloc[i] == loc && dflag >= 2)
714				goto l5010;
715l5120:		if ((liq() == k && here(bottle)) || k == liqloc(loc))
716			goto l5010;
717		if (obj != plant || !at(plant2) || prop[plant2] == 0)
718			goto l5130;
719		obj = plant2;
720		goto l5010;
721l5130:		if (obj != knife || knfloc != loc)
722			goto l5140;
723		knfloc = -1;
724		spk = 116;
725		goto l2011;
726l5140:		if (obj != rod || !here(rod2))
727			goto l5190;
728		obj = rod2;
729		goto l5010;
730l5190:		if ((verb == find || verb == invent) && wd2[0] == 0)
731			goto l5010;
732		printf("I see no %s here\n", wd1);
733		goto l2012;
734	}
735}
736