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