mirror of https://github.com/sean-m/zork
529 lines
11 KiB
C
529 lines
11 KiB
C
/* TROLLP- TROLL FUNCTION */
|
|
|
|
/*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
|
|
/* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
|
|
/* WRITTEN BY R. M. SUPNIK */
|
|
|
|
#include "funcs.h"
|
|
#include "vars.h"
|
|
|
|
logical trollp_(arg)
|
|
integer arg;
|
|
{
|
|
/* System generated locals */
|
|
logical ret_val;
|
|
|
|
/* Local variables */
|
|
integer i;
|
|
|
|
ret_val = TRUE_;
|
|
/* !ASSUME WINS. */
|
|
if (prsvec_1.prsa != vindex_1.fightw) {
|
|
goto L1100;
|
|
}
|
|
/* !FIGHT? */
|
|
if (objcts_1.ocan[oindex_1.axe - 1] == oindex_1.troll) {
|
|
goto L10;
|
|
}
|
|
/* !GOT AXE? NOTHING. */
|
|
i = 433;
|
|
/* !ASSUME CANT GET. */
|
|
if (! qhere_(oindex_1.axe, play_1.here)) {
|
|
goto L1050;
|
|
}
|
|
/* !HERE? */
|
|
i = 434;
|
|
/* !YES, RECOVER. */
|
|
newsta_(oindex_1.axe, 0, 0, oindex_1.troll, 0);
|
|
L1050:
|
|
if (qhere_(oindex_1.troll, play_1.here)) {
|
|
rspeak_(i);
|
|
}
|
|
/* !IF PLAYER HERE. */
|
|
return ret_val;
|
|
|
|
L1100:
|
|
if (prsvec_1.prsa != vindex_1.deadxw) {
|
|
goto L1200;
|
|
}
|
|
/* !DEAD? */
|
|
findex_1.trollf = TRUE_;
|
|
/* !PERMIT EXITS. */
|
|
return ret_val;
|
|
|
|
L1200:
|
|
if (prsvec_1.prsa != vindex_1.outxw) {
|
|
goto L1300;
|
|
}
|
|
/* !OUT? */
|
|
findex_1.trollf = TRUE_;
|
|
/* !PERMIT EXITS. */
|
|
objcts_1.oflag1[oindex_1.axe - 1] &= ~ VISIBT;
|
|
objcts_1.odesc1[oindex_1.troll - 1] = 435;
|
|
/* !TROLL OUT. */
|
|
return ret_val;
|
|
|
|
L1300:
|
|
if (prsvec_1.prsa != vindex_1.inxw) {
|
|
goto L1400;
|
|
}
|
|
/* !WAKE UP? */
|
|
findex_1.trollf = FALSE_;
|
|
/* !FORBID EXITS. */
|
|
objcts_1.oflag1[oindex_1.axe - 1] |= VISIBT;
|
|
objcts_1.odesc1[oindex_1.troll - 1] = 436;
|
|
/* !TROLL IN. */
|
|
if (qhere_(oindex_1.troll, play_1.here)) {
|
|
rspeak_(437);
|
|
}
|
|
return ret_val;
|
|
|
|
L1400:
|
|
if (prsvec_1.prsa != vindex_1.frstqw) {
|
|
goto L1500;
|
|
}
|
|
/* !FIRST ENCOUNTER? */
|
|
ret_val = prob_(33, 66);
|
|
/* !33% TRUE UNLESS BADLK. */
|
|
return ret_val;
|
|
|
|
L1500:
|
|
if (prsvec_1.prsa != vindex_1.movew && prsvec_1.prsa != vindex_1.takew &&
|
|
prsvec_1.prsa != vindex_1.mungw && prsvec_1.prsa !=
|
|
vindex_1.throww && prsvec_1.prsa != vindex_1.givew) {
|
|
goto L2000;
|
|
}
|
|
if (objcts_1.ocapac[oindex_1.troll - 1] >= 0) {
|
|
goto L1550;
|
|
}
|
|
/* !TROLL OUT? */
|
|
objcts_1.ocapac[oindex_1.troll - 1] = -objcts_1.ocapac[oindex_1.troll - 1]
|
|
;
|
|
/* !YES, WAKE HIM. */
|
|
objcts_1.oflag1[oindex_1.axe - 1] |= VISIBT;
|
|
findex_1.trollf = FALSE_;
|
|
objcts_1.odesc1[oindex_1.troll - 1] = 436;
|
|
rspeak_(437);
|
|
|
|
L1550:
|
|
if (prsvec_1.prsa != vindex_1.takew && prsvec_1.prsa != vindex_1.movew) {
|
|
goto L1600;
|
|
}
|
|
rspeak_(438);
|
|
/* !JOKE. */
|
|
return ret_val;
|
|
|
|
L1600:
|
|
if (prsvec_1.prsa != vindex_1.mungw) {
|
|
goto L1700;
|
|
}
|
|
/* !MUNG? */
|
|
rspeak_(439);
|
|
/* !JOKE. */
|
|
return ret_val;
|
|
|
|
L1700:
|
|
if (prsvec_1.prso == 0) {
|
|
goto L10;
|
|
}
|
|
/* !NO OBJECT? */
|
|
i = 440;
|
|
/* !ASSUME THROW. */
|
|
if (prsvec_1.prsa == vindex_1.givew) {
|
|
i = 441;
|
|
}
|
|
/* !GIVE? */
|
|
rspsub_(i, objcts_1.odesc2[prsvec_1.prso - 1]);
|
|
/* !TROLL TAKES. */
|
|
if (prsvec_1.prso == oindex_1.knife) {
|
|
goto L1900;
|
|
}
|
|
/* !OBJ KNIFE? */
|
|
newsta_(prsvec_1.prso, 442, 0, 0, 0);
|
|
/* !NO, EATS IT. */
|
|
return ret_val;
|
|
|
|
L1900:
|
|
rspeak_(443);
|
|
/* !KNIFE, THROWS IT BACK */
|
|
objcts_1.oflag2[oindex_1.troll - 1] |= FITEBT;
|
|
return ret_val;
|
|
|
|
L2000:
|
|
if (! findex_1.trollf || prsvec_1.prsa != vindex_1.hellow) {
|
|
goto L10;
|
|
}
|
|
rspeak_(366);
|
|
/* !TROLL OUT. */
|
|
return ret_val;
|
|
|
|
L10:
|
|
ret_val = FALSE_;
|
|
/* !COULDNT HANDLE IT. */
|
|
return ret_val;
|
|
} /* trollp_ */
|
|
|
|
/* CYCLOP- CYCLOPS FUNCTION */
|
|
|
|
/* DECLARATIONS */
|
|
|
|
logical cyclop_(arg)
|
|
integer arg;
|
|
{
|
|
/* System generated locals */
|
|
integer i__1, i__2;
|
|
logical ret_val;
|
|
|
|
/* Local variables */
|
|
integer i;
|
|
|
|
ret_val = TRUE_;
|
|
/* !ASSUME WINS. */
|
|
if (! findex_1.cyclof) {
|
|
goto L100;
|
|
}
|
|
/* !ASLEEP? */
|
|
if (prsvec_1.prsa != vindex_1.alarmw && prsvec_1.prsa != vindex_1.mungw &&
|
|
prsvec_1.prsa != vindex_1.hellow && prsvec_1.prsa !=
|
|
vindex_1.burnw && prsvec_1.prsa != vindex_1.killw &&
|
|
prsvec_1.prsa != vindex_1.attacw) {
|
|
goto L10;
|
|
}
|
|
findex_1.cyclof = FALSE_;
|
|
/* !WAKE CYCLOPS. */
|
|
rspeak_(187);
|
|
/* !DESCRIBE. */
|
|
findex_1.rvcyc = abs(findex_1.rvcyc);
|
|
objcts_1.oflag2[oindex_1.cyclo - 1] = (objcts_1.oflag2[oindex_1.cyclo - 1]
|
|
| FITEBT) & ~ SLEPBT;
|
|
return ret_val;
|
|
|
|
L100:
|
|
if (prsvec_1.prsa == vindex_1.fightw || prsvec_1.prsa == vindex_1.frstqw)
|
|
{
|
|
goto L10;
|
|
}
|
|
if (abs(findex_1.rvcyc) <= 5) {
|
|
goto L200;
|
|
}
|
|
/* !ANNOYED TOO MUCH? */
|
|
findex_1.rvcyc = 0;
|
|
/* !RESTART COUNT. */
|
|
jigsup_(188);
|
|
/* !YES, EATS PLAYER. */
|
|
return ret_val;
|
|
|
|
L200:
|
|
if (prsvec_1.prsa != vindex_1.givew) {
|
|
goto L500;
|
|
}
|
|
/* !GIVE? */
|
|
if (prsvec_1.prso != oindex_1.food || findex_1.rvcyc < 0) {
|
|
goto L300;
|
|
}
|
|
/* !FOOD WHEN HUNGRY? */
|
|
newsta_(oindex_1.food, 189, 0, 0, 0);
|
|
/* !EATS PEPPERS. */
|
|
/* Computing MIN */
|
|
i__1 = -1, i__2 = -findex_1.rvcyc;
|
|
findex_1.rvcyc = min(i__1,i__2);
|
|
/* !GETS THIRSTY. */
|
|
return ret_val;
|
|
|
|
L300:
|
|
if (prsvec_1.prso != oindex_1.water) {
|
|
goto L400;
|
|
}
|
|
/* !DRINK WHEN THIRSTY? */
|
|
if (findex_1.rvcyc >= 0) {
|
|
goto L350;
|
|
}
|
|
newsta_(prsvec_1.prso, 190, 0, 0, 0);
|
|
/* !DRINKS AND */
|
|
findex_1.cyclof = TRUE_;
|
|
/* !FALLS ASLEEP. */
|
|
objcts_1.oflag2[oindex_1.cyclo - 1] = (objcts_1.oflag2[oindex_1.cyclo - 1]
|
|
| SLEPBT) & ~ FITEBT;
|
|
return ret_val;
|
|
|
|
L350:
|
|
rspeak_(191);
|
|
/* !NOT THIRSTY. */
|
|
L10:
|
|
ret_val = FALSE_;
|
|
/* !FAILS. */
|
|
return ret_val;
|
|
|
|
L400:
|
|
i = 192;
|
|
/* !ASSUME INEDIBLE. */
|
|
if (prsvec_1.prso == oindex_1.garli) {
|
|
i = 193;
|
|
}
|
|
/* !GARLIC IS JOKE. */
|
|
L450:
|
|
rspeak_(i);
|
|
/* !DISDAIN IT. */
|
|
if (findex_1.rvcyc < 0) {
|
|
--findex_1.rvcyc;
|
|
}
|
|
if (findex_1.rvcyc >= 0) {
|
|
++findex_1.rvcyc;
|
|
}
|
|
if (! findex_1.cyclof) {
|
|
i__1 = abs(findex_1.rvcyc) + 193;
|
|
rspeak_(i__1);
|
|
}
|
|
return ret_val;
|
|
|
|
L500:
|
|
i = 0;
|
|
/* !ASSUME NOT HANDLED. */
|
|
if (prsvec_1.prsa == vindex_1.hellow) {
|
|
goto L450;
|
|
}
|
|
/* !HELLO IS NO GO. */
|
|
if (prsvec_1.prsa == vindex_1.throww || prsvec_1.prsa == vindex_1.mungw) {
|
|
|
|
i = rnd_(2) + 200;
|
|
}
|
|
if (prsvec_1.prsa == vindex_1.takew) {
|
|
i = 202;
|
|
}
|
|
if (prsvec_1.prsa == vindex_1.tiew) {
|
|
i = 203;
|
|
}
|
|
if (i <= 0) {
|
|
goto L10;
|
|
} else {
|
|
goto L450;
|
|
}
|
|
/* !SEE IF HANDLED. */
|
|
|
|
} /* cyclop_ */
|
|
|
|
/* THIEFP- THIEF FUNCTION */
|
|
|
|
/* DECLARATIONS */
|
|
|
|
logical thiefp_(arg)
|
|
integer arg;
|
|
{
|
|
/* System generated locals */
|
|
integer i__1;
|
|
logical ret_val;
|
|
|
|
/* Local variables */
|
|
integer i, j;
|
|
|
|
ret_val = TRUE_;
|
|
/* !ASSUME WINS. */
|
|
if (prsvec_1.prsa != vindex_1.fightw) {
|
|
goto L100;
|
|
}
|
|
/* !FIGHT? */
|
|
if (objcts_1.ocan[oindex_1.still - 1] == oindex_1.thief) {
|
|
goto L10;
|
|
}
|
|
/* !GOT STILLETTO? F. */
|
|
if (qhere_(oindex_1.still, hack_1.thfpos)) {
|
|
goto L50;
|
|
}
|
|
/* !CAN HE RECOVER IT? */
|
|
newsta_(oindex_1.thief, 0, 0, 0, 0);
|
|
/* !NO, VANISH. */
|
|
if (qhere_(oindex_1.thief, play_1.here)) {
|
|
rspeak_(498);
|
|
}
|
|
/* !IF HERO, TELL. */
|
|
return ret_val;
|
|
|
|
L50:
|
|
newsta_(oindex_1.still, 0, 0, oindex_1.thief, 0);
|
|
/* !YES, RECOVER. */
|
|
if (qhere_(oindex_1.thief, play_1.here)) {
|
|
rspeak_(499);
|
|
}
|
|
/* !IF HERO, TELL. */
|
|
return ret_val;
|
|
|
|
L100:
|
|
if (prsvec_1.prsa != vindex_1.deadxw) {
|
|
goto L200;
|
|
}
|
|
/* !DEAD? */
|
|
hack_1.thfact = FALSE_;
|
|
/* !DISABLE DEMON. */
|
|
objcts_1.oflag1[oindex_1.chali - 1] |= TAKEBT;
|
|
j = 0;
|
|
i__1 = objcts_1.olnt;
|
|
for (i = 1; i <= i__1; ++i) {
|
|
/* !CARRYING ANYTHING? */
|
|
/* L125: */
|
|
if (objcts_1.oadv[i - 1] == -oindex_1.thief) {
|
|
j = 500;
|
|
}
|
|
}
|
|
rspeak_(j);
|
|
/* !TELL IF BOOTY REAPPEARS. */
|
|
|
|
j = 501;
|
|
i__1 = objcts_1.olnt;
|
|
for (i = 1; i <= i__1; ++i) {
|
|
/* !LOOP. */
|
|
if (i == oindex_1.chali || i == oindex_1.thief || play_1.here !=
|
|
rindex_1.treas || ! qhere_(i, play_1.here)) {
|
|
goto L135;
|
|
}
|
|
objcts_1.oflag1[i - 1] |= VISIBT;
|
|
rspsub_(j, objcts_1.odesc2[i - 1]);
|
|
/* !DESCRIBE. */
|
|
j = 502;
|
|
goto L150;
|
|
|
|
L135:
|
|
if (objcts_1.oadv[i - 1] == -oindex_1.thief) {
|
|
newsta_(i, 0, play_1.here, 0, 0);
|
|
}
|
|
L150:
|
|
;
|
|
}
|
|
return ret_val;
|
|
|
|
L200:
|
|
if (prsvec_1.prsa != vindex_1.frstqw) {
|
|
goto L250;
|
|
}
|
|
/* !FIRST ENCOUNTER? */
|
|
ret_val = prob_(20, 75);
|
|
return ret_val;
|
|
|
|
L250:
|
|
if (prsvec_1.prsa != vindex_1.hellow || objcts_1.odesc1[oindex_1.thief -
|
|
1] != 504) {
|
|
goto L300;
|
|
}
|
|
rspeak_(626);
|
|
return ret_val;
|
|
|
|
L300:
|
|
if (prsvec_1.prsa != vindex_1.outxw) {
|
|
goto L400;
|
|
}
|
|
/* !OUT? */
|
|
hack_1.thfact = FALSE_;
|
|
/* !DISABLE DEMON. */
|
|
objcts_1.odesc1[oindex_1.thief - 1] = 504;
|
|
/* !CHANGE DESCRIPTION. */
|
|
objcts_1.oflag1[oindex_1.still - 1] &= ~ VISIBT;
|
|
objcts_1.oflag1[oindex_1.chali - 1] |= TAKEBT;
|
|
return ret_val;
|
|
|
|
L400:
|
|
if (prsvec_1.prsa != vindex_1.inxw) {
|
|
goto L500;
|
|
}
|
|
/* !IN? */
|
|
if (qhere_(oindex_1.thief, play_1.here)) {
|
|
rspeak_(505);
|
|
}
|
|
/* !CAN HERO SEE? */
|
|
hack_1.thfact = TRUE_;
|
|
/* !ENABLE DEMON. */
|
|
objcts_1.odesc1[oindex_1.thief - 1] = 503;
|
|
/* !CHANGE DESCRIPTION. */
|
|
objcts_1.oflag1[oindex_1.still - 1] |= VISIBT;
|
|
if (play_1.here == rindex_1.treas && qhere_(oindex_1.chali, play_1.here)
|
|
) {
|
|
objcts_1.oflag1[oindex_1.chali - 1] &= ~ TAKEBT;
|
|
}
|
|
return ret_val;
|
|
|
|
L500:
|
|
if (prsvec_1.prsa != vindex_1.takew) {
|
|
goto L600;
|
|
}
|
|
/* !TAKE? */
|
|
rspeak_(506);
|
|
/* !JOKE. */
|
|
return ret_val;
|
|
|
|
L600:
|
|
if (prsvec_1.prsa != vindex_1.throww || prsvec_1.prso != oindex_1.knife ||
|
|
(objcts_1.oflag2[oindex_1.thief - 1] & FITEBT) != 0) {
|
|
goto L700;
|
|
}
|
|
if (prob_(10, 10)) {
|
|
goto L650;
|
|
}
|
|
/* !THREW KNIFE, 10%? */
|
|
rspeak_(507);
|
|
/* !NO, JUST MAKES */
|
|
objcts_1.oflag2[oindex_1.thief - 1] |= FITEBT;
|
|
return ret_val;
|
|
|
|
L650:
|
|
j = 508;
|
|
/* !THIEF DROPS STUFF. */
|
|
i__1 = objcts_1.olnt;
|
|
for (i = 1; i <= i__1; ++i) {
|
|
if (objcts_1.oadv[i - 1] != -oindex_1.thief) {
|
|
goto L675;
|
|
}
|
|
/* !THIEF CARRYING? */
|
|
j = 509;
|
|
newsta_(i, 0, play_1.here, 0, 0);
|
|
L675:
|
|
;
|
|
}
|
|
newsta_(oindex_1.thief, j, 0, 0, 0);
|
|
/* !THIEF VANISHES. */
|
|
return ret_val;
|
|
|
|
L700:
|
|
if (prsvec_1.prsa != vindex_1.throww && prsvec_1.prsa != vindex_1.givew ||
|
|
prsvec_1.prso == 0 || prsvec_1.prso == oindex_1.thief) {
|
|
goto L10;
|
|
}
|
|
if (objcts_1.ocapac[oindex_1.thief - 1] >= 0) {
|
|
goto L750;
|
|
}
|
|
/* !WAKE HIM UP. */
|
|
objcts_1.ocapac[oindex_1.thief - 1] = -objcts_1.ocapac[oindex_1.thief - 1]
|
|
;
|
|
hack_1.thfact = TRUE_;
|
|
objcts_1.oflag1[oindex_1.still - 1] |= VISIBT;
|
|
objcts_1.odesc1[oindex_1.thief - 1] = 503;
|
|
rspeak_(510);
|
|
|
|
L750:
|
|
if (prsvec_1.prso != oindex_1.brick || objcts_1.ocan[oindex_1.fuse - 1] !=
|
|
oindex_1.brick || cevent_1.ctick[cindex_1.cevfus - 1] == 0) {
|
|
goto L800;
|
|
}
|
|
rspeak_(511);
|
|
/* !THIEF REFUSES BOMB. */
|
|
return ret_val;
|
|
|
|
L800:
|
|
i__1 = -oindex_1.thief;
|
|
newsta_(prsvec_1.prso, 0, 0, 0, i__1);
|
|
/* !THIEF TAKES GIFT. */
|
|
if (objcts_1.otval[prsvec_1.prso - 1] > 0) {
|
|
goto L900;
|
|
}
|
|
/* !A TREASURE? */
|
|
rspsub_(512, objcts_1.odesc2[prsvec_1.prso - 1]);
|
|
return ret_val;
|
|
|
|
L900:
|
|
rspsub_(627, objcts_1.odesc2[prsvec_1.prso - 1]);
|
|
/* !THIEF ENGROSSED. */
|
|
findex_1.thfenf = TRUE_;
|
|
return ret_val;
|
|
|
|
L10:
|
|
ret_val = FALSE_;
|
|
return ret_val;
|
|
} /* thiefp_ */
|