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