zork/actors.c

408 lines
9.5 KiB
C

/* AAPPLI- APPLICABLES FOR ADVENTURERS */
/*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 aappli_(ri)
integer ri;
{
/* System generated locals */
logical ret_val;
/* Local variables */
logical f;
integer i;
if (ri == 0) {
goto L10;
}
/* !IF ZERO, NO APP. */
ret_val = TRUE_;
/* !ASSUME WINS. */
switch (ri) {
case 1: goto L1000;
case 2: goto L2000;
}
/* !BRANCH ON ADV. */
bug_(11, ri);
/* COMMON FALSE RETURN. */
L10:
ret_val = FALSE_;
return ret_val;
/* A1-- ROBOT. PROCESS MOST COMMANDS GIVEN TO ROBOT. */
L1000:
if (prsvec_1.prsa != vindex_1.raisew || prsvec_1.prso != oindex_1.rcage) {
goto L1200;
}
cevent_1.cflag[cindex_1.cevsph - 1] = FALSE_;
/* !ROBOT RAISED CAGE. */
play_1.winner = aindex_1.player;
/* !RESET FOR PLAYER. */
f = moveto_(rindex_1.cager, play_1.winner);
/* !MOVE TO NEW ROOM. */
newsta_(oindex_1.cage, 567, rindex_1.cager, 0, 0);
/* !INSTALL CAGE IN ROOM. */
newsta_(oindex_1.robot, 0, rindex_1.cager, 0, 0);
/* !INSTALL ROBOT IN ROOM. */
advs_1.aroom[aindex_1.arobot - 1] = rindex_1.cager;
/* !ALSO MOVE ROBOT/ADV. */
findex_1.cagesf = TRUE_;
/* !CAGE SOLVED. */
objcts_1.oflag1[oindex_1.robot - 1] &= ~ NDSCBT;
objcts_1.oflag1[oindex_1.spher - 1] |= TAKEBT;
return ret_val;
L1200:
if (prsvec_1.prsa != vindex_1.drinkw && prsvec_1.prsa != vindex_1.eatw) {
goto L1300;
}
rspeak_(568);
/* !EAT OR DRINK, JOKE. */
return ret_val;
L1300:
if (prsvec_1.prsa != vindex_1.readw) {
goto L1400;
}
/* !READ, */
rspeak_(569);
/* !JOKE. */
return ret_val;
L1400:
if (prsvec_1.prsa == vindex_1.walkw || prsvec_1.prsa == vindex_1.takew ||
prsvec_1.prsa == vindex_1.dropw || prsvec_1.prsa == vindex_1.putw
|| prsvec_1.prsa == vindex_1.pushw || prsvec_1.prsa ==
vindex_1.throww || prsvec_1.prsa == vindex_1.turnw ||
prsvec_1.prsa == vindex_1.leapw) {
goto L10;
}
rspeak_(570);
/* !JOKE. */
return ret_val;
/* AAPPLI, PAGE 3 */
/* A2-- MASTER. PROCESS MOST COMMANDS GIVEN TO MASTER. */
L2000:
if ((objcts_1.oflag2[oindex_1.qdoor - 1] & OPENBT) != 0) {
goto L2100;
}
rspeak_(783);
/* !NO MASTER YET. */
return ret_val;
L2100:
if (prsvec_1.prsa != vindex_1.walkw) {
goto L2200;
}
/* !WALK? */
i = 784;
/* !ASSUME WONT. */
if (play_1.here == rindex_1.scorr && (prsvec_1.prso == xsrch_1.xnorth ||
prsvec_1.prso == xsrch_1.xenter) || play_1.here == rindex_1.ncorr
&& (prsvec_1.prso == xsrch_1.xsouth || prsvec_1.prso ==
xsrch_1.xenter)) {
i = 785;
}
rspeak_(i);
return ret_val;
L2200:
if (prsvec_1.prsa == vindex_1.takew || prsvec_1.prsa == vindex_1.dropw ||
prsvec_1.prsa == vindex_1.putw || prsvec_1.prsa ==
vindex_1.throww || prsvec_1.prsa == vindex_1.pushw ||
prsvec_1.prsa == vindex_1.turnw || prsvec_1.prsa ==
vindex_1.spinw || prsvec_1.prsa == vindex_1.trntow ||
prsvec_1.prsa == vindex_1.follow || prsvec_1.prsa ==
vindex_1.stayw || prsvec_1.prsa == vindex_1.openw ||
prsvec_1.prsa == vindex_1.closew || prsvec_1.prsa ==
vindex_1.killw) {
goto L10;
}
rspeak_(786);
/* !MASTER CANT DO IT. */
return ret_val;
} /* aappli_ */
/* THIEFD- INTERMOVE THIEF DEMON */
/* DECLARATIONS */
void thiefd_()
{
/* System generated locals */
integer i__1, i__2;
/* Local variables */
integer i, j, nr;
logical once;
integer rhere;
/* !SET UP DETAIL FLAG. */
once = FALSE_;
/* !INIT FLAG. */
L1025:
rhere = objcts_1.oroom[oindex_1.thief - 1];
/* !VISIBLE POS. */
if (rhere != 0) {
hack_1.thfpos = rhere;
}
if (hack_1.thfpos == play_1.here) {
goto L1100;
}
/* !THIEF IN WIN RM? */
if (hack_1.thfpos != rindex_1.treas) {
goto L1400;
}
/* !THIEF NOT IN TREAS? */
/* THIEF IS IN TREASURE ROOM, AND WINNER IS NOT. */
if (rhere == 0) {
goto L1050;
}
/* !VISIBLE? */
newsta_(oindex_1.thief, 0, 0, 0, 0);
/* !YES, VANISH. */
rhere = 0;
if (qhere_(oindex_1.still, rindex_1.treas) || objcts_1.oadv[
oindex_1.still - 1] == -oindex_1.thief) {
newsta_(oindex_1.still, 0, 0, oindex_1.thief, 0);
}
L1050:
i__1 = -oindex_1.thief;
i = robadv_(i__1, hack_1.thfpos, 0, 0);
/* !DROP VALUABLES. */
if (qhere_(oindex_1.egg, hack_1.thfpos)) {
objcts_1.oflag2[oindex_1.egg - 1] |= OPENBT;
}
goto L1700;
/* THIEF AND WINNER IN SAME ROOM. */
L1100:
if (hack_1.thfpos == rindex_1.treas) {
goto L1700;
}
/* !IF TREAS ROOM, NOTHING. */
if ((rooms_1.rflag[hack_1.thfpos - 1] & RLIGHT) != 0) {
goto L1400;
}
if (hack_1.thfflg) {
goto L1300;
}
/* !THIEF ANNOUNCED? */
if (rhere != 0 || prob_(70, 70)) {
goto L1150;
}
/* !IF INVIS AND 30%. */
if (objcts_1.ocan[oindex_1.still - 1] != oindex_1.thief) {
goto L1700;
}
/* !ABORT IF NO STILLETTO. */
newsta_(oindex_1.thief, 583, hack_1.thfpos, 0, 0);
/* !INSERT THIEF INTO ROOM. */
hack_1.thfflg = TRUE_;
/* !THIEF IS ANNOUNCED. */
return;
L1150:
if (rhere == 0 || (objcts_1.oflag2[oindex_1.thief - 1] & FITEBT)
== 0) {
goto L1200;
}
if (winnin_(oindex_1.thief, play_1.winner)) {
goto L1175;
}
/* !WINNING? */
newsta_(oindex_1.thief, 584, 0, 0, 0);
/* !NO, VANISH THIEF. */
objcts_1.oflag2[oindex_1.thief - 1] &= ~ FITEBT;
if (qhere_(oindex_1.still, hack_1.thfpos) || objcts_1.oadv[
oindex_1.still - 1] == -oindex_1.thief) {
newsta_(oindex_1.still, 0, 0, oindex_1.thief, 0);
}
return;
L1175:
if (prob_(90, 90)) {
goto L1700;
}
/* !90% CHANCE TO STAY. */
L1200:
if (rhere == 0 || prob_(70, 70)) {
goto L1250;
}
/* !IF VISIBLE AND 30% */
newsta_(oindex_1.thief, 585, 0, 0, 0);
/* !VANISH THIEF. */
if (qhere_(oindex_1.still, hack_1.thfpos) || objcts_1.oadv[
oindex_1.still - 1] == -oindex_1.thief) {
newsta_(oindex_1.still, 0, 0, oindex_1.thief, 0);
}
return;
L1300:
if (rhere == 0) {
goto L1700;
}
/* !ANNOUNCED. VISIBLE? */
L1250:
if (prob_(70, 70)) {
return;
}
/* !70% CHANCE TO DO NOTHING. */
hack_1.thfflg = TRUE_;
i__1 = -oindex_1.thief;
i__2 = -oindex_1.thief;
nr = robrm_(hack_1.thfpos, 100, 0, 0, i__1) + robadv_(
play_1.winner, 0, 0, i__2);
i = 586;
/* !ROBBED EM. */
if (rhere != 0) {
i = 588;
}
/* !WAS HE VISIBLE? */
if (nr != 0) {
++i;
}
/* !DID HE GET ANYTHING? */
newsta_(oindex_1.thief, i, 0, 0, 0);
/* !VANISH THIEF. */
if (qhere_(oindex_1.still, hack_1.thfpos) || objcts_1.oadv[
oindex_1.still - 1] == -oindex_1.thief) {
newsta_(oindex_1.still, 0, 0, oindex_1.thief, 0);
}
if (nr != 0 && ! lit_(hack_1.thfpos)) {
rspeak_(406);
}
rhere = 0;
goto L1700;
/* !ONWARD. */
/* NOT IN ADVENTURERS ROOM. */
L1400:
newsta_(oindex_1.thief, 0, 0, 0, 0);
/* !VANISH. */
rhere = 0;
if (qhere_(oindex_1.still, hack_1.thfpos) || objcts_1.oadv[
oindex_1.still - 1] == -oindex_1.thief) {
newsta_(oindex_1.still, 0, 0, oindex_1.thief, 0);
}
if ((rooms_1.rflag[hack_1.thfpos - 1] & RSEEN) == 0) {
goto L1700;
}
i__1 = -oindex_1.thief;
i = robrm_(hack_1.thfpos, 75, 0, 0, i__1);
/* !ROB ROOM 75%. */
if (hack_1.thfpos < rindex_1.maze1 || hack_1.thfpos > rindex_1.maz15 ||
play_1.here < rindex_1.maze1 || play_1.here > rindex_1.maz15) {
goto L1500;
}
i__1 = objcts_1.olnt;
for (i = 1; i <= i__1; ++i) {
/* !BOTH IN MAZE. */
if (! qhere_(i, hack_1.thfpos) || prob_(60, 60) || (
objcts_1.oflag1[i - 1] & VISIBT + TAKEBT) !=
VISIBT + TAKEBT) {
goto L1450;
}
rspsub_(590, objcts_1.odesc2[i - 1]);
/* !TAKE OBJECT. */
if (prob_(40, 20)) {
goto L1700;
}
i__2 = -oindex_1.thief;
newsta_(i, 0, 0, 0, i__2);
/* !MOST OF THE TIME. */
objcts_1.oflag2[i - 1] |= TCHBT;
goto L1700;
L1450:
;
}
goto L1700;
L1500:
i__1 = objcts_1.olnt;
for (i = 1; i <= i__1; ++i) {
/* !NOT IN MAZE. */
if (! qhere_(i, hack_1.thfpos) || objcts_1.otval[i - 1] != 0 ||
prob_(80, 60) || (objcts_1.oflag1[i - 1] &
VISIBT + TAKEBT) != VISIBT +
TAKEBT) {
goto L1550;
}
i__2 = -oindex_1.thief;
newsta_(i, 0, 0, 0, i__2);
objcts_1.oflag2[i - 1] |= TCHBT;
goto L1700;
L1550:
;
}
/* NOW MOVE TO NEW ROOM. */
L1700:
if (objcts_1.oadv[oindex_1.rope - 1] == -oindex_1.thief) {
findex_1.domef = FALSE_;
}
if (once) {
goto L1800;
}
once = ! once;
L1750:
--hack_1.thfpos;
/* !NEXT ROOM. */
if (hack_1.thfpos <= 0) {
hack_1.thfpos = rooms_1.rlnt;
}
if ((rooms_1.rflag[hack_1.thfpos - 1] & RLAND + RSACRD +
REND) != RLAND) {
goto L1750;
}
hack_1.thfflg = FALSE_;
/* !NOT ANNOUNCED. */
goto L1025;
/* !ONCE MORE. */
/* ALL DONE. */
L1800:
if (hack_1.thfpos == rindex_1.treas) {
return;
}
/* !IN TREASURE ROOM? */
j = 591;
/* !NO, DROP STUFF. */
if (hack_1.thfpos != play_1.here) {
j = 0;
}
i__1 = objcts_1.olnt;
for (i = 1; i <= i__1; ++i) {
if (objcts_1.oadv[i - 1] != -oindex_1.thief || prob_(70, 70)
|| objcts_1.otval[i - 1] > 0) {
goto L1850;
}
newsta_(i, j, hack_1.thfpos, 0, 0);
j = 0;
L1850:
;
}
return;
} /* thiefd_ */