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