1 /* TROLLP-	TROLL FUNCTION */
2 
3 /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
4 /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
5 /* WRITTEN BY R. M. SUPNIK */
6 
7 #include "funcs.h"
8 #include "vars.h"
9 
trollp_(arg)10 logical trollp_(arg)
11 integer arg;
12 {
13     /* System generated locals */
14     logical ret_val;
15 
16     /* Local variables */
17     integer i;
18 
19     ret_val = TRUE_;
20 /* 						!ASSUME WINS. */
21     if (prsvec_1.prsa != vindex_1.fightw) {
22 	goto L1100;
23     }
24 /* 						!FIGHT? */
25     if (objcts_1.ocan[oindex_1.axe - 1] == oindex_1.troll) {
26 	goto L10;
27     }
28 /* 						!GOT AXE?  NOTHING. */
29     i = 433;
30 /* 						!ASSUME CANT GET. */
31     if (! qhere_(oindex_1.axe, play_1.here)) {
32 	goto L1050;
33     }
34 /* 						!HERE? */
35     i = 434;
36 /* 						!YES, RECOVER. */
37     newsta_(oindex_1.axe, 0, 0, oindex_1.troll, 0);
38 L1050:
39     if (qhere_(oindex_1.troll, play_1.here)) {
40 	rspeak_(i);
41     }
42 /* 						!IF PLAYER HERE. */
43     return ret_val;
44 
45 L1100:
46     if (prsvec_1.prsa != vindex_1.deadxw) {
47 	goto L1200;
48     }
49 /* 						!DEAD? */
50     findex_1.trollf = TRUE_;
51 /* 						!PERMIT EXITS. */
52     return ret_val;
53 
54 L1200:
55     if (prsvec_1.prsa != vindex_1.outxw) {
56 	goto L1300;
57     }
58 /* 						!OUT? */
59     findex_1.trollf = TRUE_;
60 /* 						!PERMIT EXITS. */
61     objcts_1.oflag1[oindex_1.axe - 1] &= ~ VISIBT;
62     objcts_1.odesc1[oindex_1.troll - 1] = 435;
63 /* 						!TROLL OUT. */
64     return ret_val;
65 
66 L1300:
67     if (prsvec_1.prsa != vindex_1.inxw) {
68 	goto L1400;
69     }
70 /* 						!WAKE UP? */
71     findex_1.trollf = FALSE_;
72 /* 						!FORBID EXITS. */
73     objcts_1.oflag1[oindex_1.axe - 1] |= VISIBT;
74     objcts_1.odesc1[oindex_1.troll - 1] = 436;
75 /* 						!TROLL IN. */
76     if (qhere_(oindex_1.troll, play_1.here)) {
77 	rspeak_(437);
78     }
79     return ret_val;
80 
81 L1400:
82     if (prsvec_1.prsa != vindex_1.frstqw) {
83 	goto L1500;
84     }
85 /* 						!FIRST ENCOUNTER? */
86     ret_val = prob_(33, 66);
87 /* 						!33% TRUE UNLESS BADLK. */
88     return ret_val;
89 
90 L1500:
91     if (prsvec_1.prsa != vindex_1.movew && prsvec_1.prsa != vindex_1.takew &&
92 	    prsvec_1.prsa != vindex_1.mungw && prsvec_1.prsa !=
93 	    vindex_1.throww && prsvec_1.prsa != vindex_1.givew) {
94 	goto L2000;
95     }
96     if (objcts_1.ocapac[oindex_1.troll - 1] >= 0) {
97 	goto L1550;
98     }
99 /* 						!TROLL OUT? */
100     objcts_1.ocapac[oindex_1.troll - 1] = -objcts_1.ocapac[oindex_1.troll - 1]
101 	    ;
102 /* 						!YES, WAKE HIM. */
103     objcts_1.oflag1[oindex_1.axe - 1] |= VISIBT;
104     findex_1.trollf = FALSE_;
105     objcts_1.odesc1[oindex_1.troll - 1] = 436;
106     rspeak_(437);
107 
108 L1550:
109     if (prsvec_1.prsa != vindex_1.takew && prsvec_1.prsa != vindex_1.movew) {
110 	goto L1600;
111     }
112     rspeak_(438);
113 /* 						!JOKE. */
114     return ret_val;
115 
116 L1600:
117     if (prsvec_1.prsa != vindex_1.mungw) {
118 	goto L1700;
119     }
120 /* 						!MUNG? */
121     rspeak_(439);
122 /* 						!JOKE. */
123     return ret_val;
124 
125 L1700:
126     if (prsvec_1.prso == 0) {
127 	goto L10;
128     }
129 /* 						!NO OBJECT? */
130     i = 440;
131 /* 						!ASSUME THROW. */
132     if (prsvec_1.prsa == vindex_1.givew) {
133 	i = 441;
134     }
135 /* 						!GIVE? */
136     rspsub_(i, objcts_1.odesc2[prsvec_1.prso - 1]);
137 /* 						!TROLL TAKES. */
138     if (prsvec_1.prso == oindex_1.knife) {
139 	goto L1900;
140     }
141 /* 						!OBJ KNIFE? */
142     newsta_(prsvec_1.prso, 442, 0, 0, 0);
143 /* 						!NO, EATS IT. */
144     return ret_val;
145 
146 L1900:
147     rspeak_(443);
148 /* 						!KNIFE, THROWS IT BACK */
149     objcts_1.oflag2[oindex_1.troll - 1] |= FITEBT;
150     return ret_val;
151 
152 L2000:
153     if (! findex_1.trollf || prsvec_1.prsa != vindex_1.hellow) {
154 	goto L10;
155     }
156     rspeak_(366);
157 /* 						!TROLL OUT. */
158     return ret_val;
159 
160 L10:
161     ret_val = FALSE_;
162 /* 						!COULDNT HANDLE IT. */
163     return ret_val;
164 } /* trollp_ */
165 
166 /* CYCLOP-	CYCLOPS FUNCTION */
167 
168 /* DECLARATIONS */
169 
cyclop_(arg)170 logical cyclop_(arg)
171 integer arg;
172 {
173     /* System generated locals */
174     integer i__1, i__2;
175     logical ret_val;
176 
177     /* Local variables */
178     integer i;
179 
180     ret_val = TRUE_;
181 /* 						!ASSUME WINS. */
182     if (! findex_1.cyclof) {
183 	goto L100;
184     }
185 /* 						!ASLEEP? */
186     if (prsvec_1.prsa != vindex_1.alarmw && prsvec_1.prsa != vindex_1.mungw &&
187 	     prsvec_1.prsa != vindex_1.hellow && prsvec_1.prsa !=
188 	    vindex_1.burnw && prsvec_1.prsa != vindex_1.killw &&
189 	    prsvec_1.prsa != vindex_1.attacw) {
190 	goto L10;
191     }
192     findex_1.cyclof = FALSE_;
193 /* 						!WAKE CYCLOPS. */
194     rspeak_(187);
195 /* 						!DESCRIBE. */
196     findex_1.rvcyc = abs(findex_1.rvcyc);
197     objcts_1.oflag2[oindex_1.cyclo - 1] = (objcts_1.oflag2[oindex_1.cyclo - 1]
198 	     | FITEBT) & ~ SLEPBT;
199     return ret_val;
200 
201 L100:
202     if (prsvec_1.prsa == vindex_1.fightw || prsvec_1.prsa == vindex_1.frstqw)
203 	    {
204 	goto L10;
205     }
206     if (abs(findex_1.rvcyc) <= 5) {
207 	goto L200;
208     }
209 /* 						!ANNOYED TOO MUCH? */
210     findex_1.rvcyc = 0;
211 /* 						!RESTART COUNT. */
212     jigsup_(188);
213 /* 						!YES, EATS PLAYER. */
214     return ret_val;
215 
216 L200:
217     if (prsvec_1.prsa != vindex_1.givew) {
218 	goto L500;
219     }
220 /* 						!GIVE? */
221     if (prsvec_1.prso != oindex_1.food || findex_1.rvcyc < 0) {
222 	goto L300;
223     }
224 /* 						!FOOD WHEN HUNGRY? */
225     newsta_(oindex_1.food, 189, 0, 0, 0);
226 /* 						!EATS PEPPERS. */
227 /* Computing MIN */
228     i__1 = -1, i__2 = -findex_1.rvcyc;
229     findex_1.rvcyc = min(i__1,i__2);
230 /* 						!GETS THIRSTY. */
231     return ret_val;
232 
233 L300:
234     if (prsvec_1.prso != oindex_1.water) {
235 	goto L400;
236     }
237 /* 						!DRINK WHEN THIRSTY? */
238     if (findex_1.rvcyc >= 0) {
239 	goto L350;
240     }
241     newsta_(prsvec_1.prso, 190, 0, 0, 0);
242 /* 						!DRINKS AND */
243     findex_1.cyclof = TRUE_;
244 /* 						!FALLS ASLEEP. */
245     objcts_1.oflag2[oindex_1.cyclo - 1] = (objcts_1.oflag2[oindex_1.cyclo - 1]
246 	     | SLEPBT) & ~ FITEBT;
247     return ret_val;
248 
249 L350:
250     rspeak_(191);
251 /* 						!NOT THIRSTY. */
252 L10:
253     ret_val = FALSE_;
254 /* 						!FAILS. */
255     return ret_val;
256 
257 L400:
258     i = 192;
259 /* 						!ASSUME INEDIBLE. */
260     if (prsvec_1.prso == oindex_1.garli) {
261 	i = 193;
262     }
263 /* 						!GARLIC IS JOKE. */
264 L450:
265     rspeak_(i);
266 /* 						!DISDAIN IT. */
267     if (findex_1.rvcyc < 0) {
268 	--findex_1.rvcyc;
269     }
270     if (findex_1.rvcyc >= 0) {
271 	++findex_1.rvcyc;
272     }
273     if (! findex_1.cyclof) {
274 	i__1 = abs(findex_1.rvcyc) + 193;
275 	rspeak_(i__1);
276     }
277     return ret_val;
278 
279 L500:
280     i = 0;
281 /* 						!ASSUME NOT HANDLED. */
282     if (prsvec_1.prsa == vindex_1.hellow) {
283 	goto L450;
284     }
285 /* 						!HELLO IS NO GO. */
286     if (prsvec_1.prsa == vindex_1.throww || prsvec_1.prsa == vindex_1.mungw) {
287 
288 	i = rnd_(2) + 200;
289     }
290     if (prsvec_1.prsa == vindex_1.takew) {
291 	i = 202;
292     }
293     if (prsvec_1.prsa == vindex_1.tiew) {
294 	i = 203;
295     }
296     if (i <= 0) {
297 	goto L10;
298     } else {
299 	goto L450;
300     }
301 /* 						!SEE IF HANDLED. */
302 
303 } /* cyclop_ */
304 
305 /* THIEFP-	THIEF FUNCTION */
306 
307 /* DECLARATIONS */
308 
thiefp_(arg)309 logical thiefp_(arg)
310 integer arg;
311 {
312     /* System generated locals */
313     integer i__1;
314     logical ret_val;
315 
316     /* Local variables */
317     integer i, j;
318 
319     ret_val = TRUE_;
320 /* 						!ASSUME WINS. */
321     if (prsvec_1.prsa != vindex_1.fightw) {
322 	goto L100;
323     }
324 /* 						!FIGHT? */
325     if (objcts_1.ocan[oindex_1.still - 1] == oindex_1.thief) {
326 	goto L10;
327     }
328 /* 						!GOT STILLETTO?  F. */
329     if (qhere_(oindex_1.still, hack_1.thfpos)) {
330 	goto L50;
331     }
332 /* 						!CAN HE RECOVER IT? */
333     newsta_(oindex_1.thief, 0, 0, 0, 0);
334 /* 						!NO, VANISH. */
335     if (qhere_(oindex_1.thief, play_1.here)) {
336 	rspeak_(498);
337     }
338 /* 						!IF HERO, TELL. */
339     return ret_val;
340 
341 L50:
342     newsta_(oindex_1.still, 0, 0, oindex_1.thief, 0);
343 /* 						!YES, RECOVER. */
344     if (qhere_(oindex_1.thief, play_1.here)) {
345 	rspeak_(499);
346     }
347 /* 						!IF HERO, TELL. */
348     return ret_val;
349 
350 L100:
351     if (prsvec_1.prsa != vindex_1.deadxw) {
352 	goto L200;
353     }
354 /* 						!DEAD? */
355     hack_1.thfact = FALSE_;
356 /* 						!DISABLE DEMON. */
357     objcts_1.oflag1[oindex_1.chali - 1] |= TAKEBT;
358     j = 0;
359     i__1 = objcts_1.olnt;
360     for (i = 1; i <= i__1; ++i) {
361 /* 						!CARRYING ANYTHING? */
362 /* L125: */
363 	if (objcts_1.oadv[i - 1] == -oindex_1.thief) {
364 	    j = 500;
365 	}
366     }
367     rspeak_(j);
368 /* 						!TELL IF BOOTY REAPPEARS. */
369 
370     j = 501;
371     i__1 = objcts_1.olnt;
372     for (i = 1; i <= i__1; ++i) {
373 /* 						!LOOP. */
374 	if (i == oindex_1.chali || i == oindex_1.thief || play_1.here !=
375 		rindex_1.treas || ! qhere_(i, play_1.here)) {
376 	    goto L135;
377 	}
378 	objcts_1.oflag1[i - 1] |= VISIBT;
379 	rspsub_(j, objcts_1.odesc2[i - 1]);
380 /* 						!DESCRIBE. */
381 	j = 502;
382 	goto L150;
383 
384 L135:
385 	if (objcts_1.oadv[i - 1] == -oindex_1.thief) {
386 	    newsta_(i, 0, play_1.here, 0, 0);
387 	}
388 L150:
389 	;
390     }
391     return ret_val;
392 
393 L200:
394     if (prsvec_1.prsa != vindex_1.frstqw) {
395 	goto L250;
396     }
397 /* 						!FIRST ENCOUNTER? */
398     ret_val = prob_(20, 75);
399     return ret_val;
400 
401 L250:
402     if (prsvec_1.prsa != vindex_1.hellow || objcts_1.odesc1[oindex_1.thief -
403 	    1] != 504) {
404 	goto L300;
405     }
406     rspeak_(626);
407     return ret_val;
408 
409 L300:
410     if (prsvec_1.prsa != vindex_1.outxw) {
411 	goto L400;
412     }
413 /* 						!OUT? */
414     hack_1.thfact = FALSE_;
415 /* 						!DISABLE DEMON. */
416     objcts_1.odesc1[oindex_1.thief - 1] = 504;
417 /* 						!CHANGE DESCRIPTION. */
418     objcts_1.oflag1[oindex_1.still - 1] &= ~ VISIBT;
419     objcts_1.oflag1[oindex_1.chali - 1] |= TAKEBT;
420     return ret_val;
421 
422 L400:
423     if (prsvec_1.prsa != vindex_1.inxw) {
424 	goto L500;
425     }
426 /* 						!IN? */
427     if (qhere_(oindex_1.thief, play_1.here)) {
428 	rspeak_(505);
429     }
430 /* 						!CAN HERO SEE? */
431     hack_1.thfact = TRUE_;
432 /* 						!ENABLE DEMON. */
433     objcts_1.odesc1[oindex_1.thief - 1] = 503;
434 /* 						!CHANGE DESCRIPTION. */
435     objcts_1.oflag1[oindex_1.still - 1] |= VISIBT;
436     if (play_1.here == rindex_1.treas && qhere_(oindex_1.chali, play_1.here)
437 	    ) {
438 	objcts_1.oflag1[oindex_1.chali - 1] &= ~ TAKEBT;
439     }
440     return ret_val;
441 
442 L500:
443     if (prsvec_1.prsa != vindex_1.takew) {
444 	goto L600;
445     }
446 /* 						!TAKE? */
447     rspeak_(506);
448 /* 						!JOKE. */
449     return ret_val;
450 
451 L600:
452     if (prsvec_1.prsa != vindex_1.throww || prsvec_1.prso != oindex_1.knife ||
453 	     (objcts_1.oflag2[oindex_1.thief - 1] & FITEBT) != 0) {
454 	goto L700;
455     }
456     if (prob_(10, 10)) {
457 	goto L650;
458     }
459 /* 						!THREW KNIFE, 10%? */
460     rspeak_(507);
461 /* 						!NO, JUST MAKES */
462     objcts_1.oflag2[oindex_1.thief - 1] |= FITEBT;
463     return ret_val;
464 
465 L650:
466     j = 508;
467 /* 						!THIEF DROPS STUFF. */
468     i__1 = objcts_1.olnt;
469     for (i = 1; i <= i__1; ++i) {
470 	if (objcts_1.oadv[i - 1] != -oindex_1.thief) {
471 	    goto L675;
472 	}
473 /* 						!THIEF CARRYING? */
474 	j = 509;
475 	newsta_(i, 0, play_1.here, 0, 0);
476 L675:
477 	;
478     }
479     newsta_(oindex_1.thief, j, 0, 0, 0);
480 /* 						!THIEF VANISHES. */
481     return ret_val;
482 
483 L700:
484     if (prsvec_1.prsa != vindex_1.throww && prsvec_1.prsa != vindex_1.givew ||
485 	     prsvec_1.prso == 0 || prsvec_1.prso == oindex_1.thief) {
486 	goto L10;
487     }
488     if (objcts_1.ocapac[oindex_1.thief - 1] >= 0) {
489 	goto L750;
490     }
491 /* 						!WAKE HIM UP. */
492     objcts_1.ocapac[oindex_1.thief - 1] = -objcts_1.ocapac[oindex_1.thief - 1]
493 	    ;
494     hack_1.thfact = TRUE_;
495     objcts_1.oflag1[oindex_1.still - 1] |= VISIBT;
496     objcts_1.odesc1[oindex_1.thief - 1] = 503;
497     rspeak_(510);
498 
499 L750:
500     if (prsvec_1.prso != oindex_1.brick || objcts_1.ocan[oindex_1.fuse - 1] !=
501 	     oindex_1.brick || cevent_1.ctick[cindex_1.cevfus - 1] == 0) {
502 	goto L800;
503     }
504     rspeak_(511);
505 /* 						!THIEF REFUSES BOMB. */
506     return ret_val;
507 
508 L800:
509     i__1 = -oindex_1.thief;
510     newsta_(prsvec_1.prso, 0, 0, 0, i__1);
511 /* 						!THIEF TAKES GIFT. */
512     if (objcts_1.otval[prsvec_1.prso - 1] > 0) {
513 	goto L900;
514     }
515 /* 						!A TREASURE? */
516     rspsub_(512, objcts_1.odesc2[prsvec_1.prso - 1]);
517     return ret_val;
518 
519 L900:
520     rspsub_(627, objcts_1.odesc2[prsvec_1.prso - 1]);
521 /* 						!THIEF ENGROSSED. */
522     findex_1.thfenf = TRUE_;
523     return ret_val;
524 
525 L10:
526     ret_val = FALSE_;
527     return ret_val;
528 } /* thiefp_ */
529