zork/villns.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_ */