mirror of https://github.com/sean-m/zork
448 lines
9.5 KiB
C
448 lines
9.5 KiB
C
/* TAKE-- BASIC TAKE SEQUENCE */
|
|
|
|
/*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"
|
|
|
|
/* TAKE AN OBJECT (FOR VERBS TAKE, PUT, DROP, READ, ETC.) */
|
|
|
|
logical take_(flg)
|
|
logical flg;
|
|
{
|
|
/* System generated locals */
|
|
integer i__1;
|
|
logical ret_val;
|
|
|
|
/* Local variables */
|
|
integer oa;
|
|
integer x;
|
|
|
|
ret_val = FALSE_;
|
|
/* !ASSUME LOSES. */
|
|
oa = objcts_1.oactio[prsvec_1.prso - 1];
|
|
/* !GET OBJECT ACTION. */
|
|
if (prsvec_1.prso <= star_1.strbit) {
|
|
goto L100;
|
|
}
|
|
/* !STAR? */
|
|
ret_val = objact_();
|
|
/* !YES, LET IT HANDLE. */
|
|
return ret_val;
|
|
|
|
L100:
|
|
x = objcts_1.ocan[prsvec_1.prso - 1];
|
|
/* !INSIDE? */
|
|
if (prsvec_1.prso != advs_1.avehic[play_1.winner - 1]) {
|
|
goto L400;
|
|
}
|
|
/* !HIS VEHICLE? */
|
|
rspeak_(672);
|
|
/* !DUMMY. */
|
|
return ret_val;
|
|
|
|
L400:
|
|
if ((objcts_1.oflag1[prsvec_1.prso - 1] & TAKEBT) != 0) {
|
|
goto L500;
|
|
}
|
|
if (! oappli_(oa, 0)) {
|
|
i__1 = rnd_(5) + 552;
|
|
rspeak_(i__1);
|
|
}
|
|
return ret_val;
|
|
|
|
/* OBJECT IS TAKEABLE AND IN POSITION TO BE TAKEN. */
|
|
|
|
L500:
|
|
if (x != 0 || qhere_(prsvec_1.prso, play_1.here)) {
|
|
goto L600;
|
|
}
|
|
if (objcts_1.oadv[prsvec_1.prso - 1] == play_1.winner) {
|
|
rspeak_(557);
|
|
}
|
|
/* !ALREADY GOT IT? */
|
|
return ret_val;
|
|
|
|
L600:
|
|
if (x != 0 && objcts_1.oadv[x - 1] == play_1.winner || weight_(0,
|
|
prsvec_1.prso, play_1.winner) + objcts_1.osize[prsvec_1.prso - 1]
|
|
<= state_1.mxload) {
|
|
goto L700;
|
|
}
|
|
rspeak_(558);
|
|
/* !TOO MUCH WEIGHT. */
|
|
return ret_val;
|
|
|
|
L700:
|
|
ret_val = TRUE_;
|
|
/* !AT LAST. */
|
|
if (oappli_(oa, 0)) {
|
|
return ret_val;
|
|
}
|
|
/* !DID IT HANDLE? */
|
|
newsta_(prsvec_1.prso, 0, 0, 0, play_1.winner);
|
|
/* !TAKE OBJECT FOR WINNER. */
|
|
objcts_1.oflag2[prsvec_1.prso - 1] |= TCHBT;
|
|
scrupd_(objcts_1.ofval[prsvec_1.prso - 1]);
|
|
/* !UPDATE SCORE. */
|
|
objcts_1.ofval[prsvec_1.prso - 1] = 0;
|
|
/* !CANT BE SCORED AGAIN. */
|
|
if (flg) {
|
|
rspeak_(559);
|
|
}
|
|
/* !TELL TAKEN. */
|
|
return ret_val;
|
|
|
|
} /* take_ */
|
|
|
|
/* DROP- DROP VERB PROCESSOR */
|
|
|
|
/* DECLARATIONS */
|
|
|
|
logical drop_(z)
|
|
logical z;
|
|
{
|
|
/* System generated locals */
|
|
logical ret_val;
|
|
|
|
/* Local variables */
|
|
logical f;
|
|
integer i, x;
|
|
|
|
ret_val = TRUE_;
|
|
/* !ASSUME WINS. */
|
|
x = objcts_1.ocan[prsvec_1.prso - 1];
|
|
/* !GET CONTAINER. */
|
|
if (x == 0) {
|
|
goto L200;
|
|
}
|
|
/* !IS IT INSIDE? */
|
|
if (objcts_1.oadv[x - 1] != play_1.winner) {
|
|
goto L1000;
|
|
}
|
|
/* !IS HE CARRYING CON? */
|
|
if ((objcts_1.oflag2[x - 1] & OPENBT) != 0) {
|
|
goto L300;
|
|
}
|
|
rspsub_(525, objcts_1.odesc2[x - 1]);
|
|
/* !CANT REACH. */
|
|
return ret_val;
|
|
|
|
L200:
|
|
if (objcts_1.oadv[prsvec_1.prso - 1] != play_1.winner) {
|
|
goto L1000;
|
|
}
|
|
/* !IS HE CARRYING OBJ? */
|
|
L300:
|
|
if (advs_1.avehic[play_1.winner - 1] == 0) {
|
|
goto L400;
|
|
}
|
|
/* !IS HE IN VEHICLE? */
|
|
prsvec_1.prsi = advs_1.avehic[play_1.winner - 1];
|
|
/* !YES, */
|
|
f = put_(1);
|
|
/* !DROP INTO VEHICLE. */
|
|
prsvec_1.prsi = 0;
|
|
/* !DISARM PARSER. */
|
|
return ret_val;
|
|
/* !DONE. */
|
|
|
|
L400:
|
|
newsta_(prsvec_1.prso, 0, play_1.here, 0, 0);
|
|
/* !DROP INTO ROOM. */
|
|
if (play_1.here == rindex_1.mtree) {
|
|
newsta_(prsvec_1.prso, 0, rindex_1.fore3, 0, 0);
|
|
}
|
|
scrupd_(objcts_1.ofval[prsvec_1.prso - 1]);
|
|
/* !SCORE OBJECT. */
|
|
objcts_1.ofval[prsvec_1.prso - 1] = 0;
|
|
/* !CANT BE SCORED AGAIN. */
|
|
objcts_1.oflag2[prsvec_1.prso - 1] |= TCHBT;
|
|
|
|
if (objact_()) {
|
|
return ret_val;
|
|
}
|
|
/* !DID IT HANDLE? */
|
|
i = 0;
|
|
/* !ASSUME NOTHING TO SAY. */
|
|
if (prsvec_1.prsa == vindex_1.dropw) {
|
|
i = 528;
|
|
}
|
|
if (prsvec_1.prsa == vindex_1.throww) {
|
|
i = 529;
|
|
}
|
|
if (i != 0 && play_1.here == rindex_1.mtree) {
|
|
i = 659;
|
|
}
|
|
rspsub_(i, objcts_1.odesc2[prsvec_1.prso - 1]);
|
|
return ret_val;
|
|
|
|
L1000:
|
|
rspeak_(527);
|
|
/* !DONT HAVE IT. */
|
|
return ret_val;
|
|
|
|
} /* drop_ */
|
|
|
|
/* PUT- PUT VERB PROCESSOR */
|
|
|
|
/* DECLARATIONS */
|
|
|
|
logical put_(flg)
|
|
logical flg;
|
|
{
|
|
/* System generated locals */
|
|
logical ret_val;
|
|
|
|
/* Local variables */
|
|
integer j;
|
|
integer svi, svo;
|
|
|
|
ret_val = FALSE_;
|
|
if (prsvec_1.prso <= star_1.strbit && prsvec_1.prsi <= star_1.strbit) {
|
|
goto L200;
|
|
}
|
|
if (! objact_()) {
|
|
rspeak_(560);
|
|
}
|
|
/* !STAR */
|
|
ret_val = TRUE_;
|
|
return ret_val;
|
|
|
|
L200:
|
|
if ((objcts_1.oflag2[prsvec_1.prsi - 1] & OPENBT) != 0 || (
|
|
objcts_1.oflag1[prsvec_1.prsi - 1] & DOORBT +
|
|
CONTBT) != 0 || (objcts_1.oflag2[prsvec_1.prsi - 1] &
|
|
VEHBT) != 0) {
|
|
goto L300;
|
|
}
|
|
rspeak_(561);
|
|
/* !CANT PUT IN THAT. */
|
|
return ret_val;
|
|
|
|
L300:
|
|
if ((objcts_1.oflag2[prsvec_1.prsi - 1] & OPENBT) != 0) {
|
|
goto L400;
|
|
}
|
|
/* !IS IT OPEN? */
|
|
rspeak_(562);
|
|
/* !NO, JOKE */
|
|
return ret_val;
|
|
|
|
L400:
|
|
if (prsvec_1.prso != prsvec_1.prsi) {
|
|
goto L500;
|
|
}
|
|
/* !INTO ITSELF? */
|
|
rspeak_(563);
|
|
/* !YES, JOKE. */
|
|
return ret_val;
|
|
|
|
L500:
|
|
if (objcts_1.ocan[prsvec_1.prso - 1] != prsvec_1.prsi) {
|
|
goto L600;
|
|
}
|
|
/* !ALREADY INSIDE. */
|
|
rspsb2_(564, objcts_1.odesc2[prsvec_1.prso - 1], objcts_1.odesc2[
|
|
prsvec_1.prsi - 1]);
|
|
ret_val = TRUE_;
|
|
return ret_val;
|
|
|
|
L600:
|
|
if (weight_(0, prsvec_1.prso, 0) + weight_(0, prsvec_1.prsi,
|
|
0) + objcts_1.osize[prsvec_1.prso - 1] <= objcts_1.ocapac[
|
|
prsvec_1.prsi - 1]) {
|
|
goto L700;
|
|
}
|
|
rspeak_(565);
|
|
/* !THEN CANT DO IT. */
|
|
return ret_val;
|
|
|
|
/* NOW SEE IF OBJECT (OR ITS CONTAINER) IS IN ROOM */
|
|
|
|
L700:
|
|
j = prsvec_1.prso;
|
|
/* !START SEARCH. */
|
|
L725:
|
|
if (qhere_(j, play_1.here)) {
|
|
goto L750;
|
|
}
|
|
/* !IS IT HERE? */
|
|
j = objcts_1.ocan[j - 1];
|
|
if (j != 0) {
|
|
goto L725;
|
|
}
|
|
/* !MORE TO DO? */
|
|
goto L800;
|
|
/* !NO, SCH FAILS. */
|
|
|
|
L750:
|
|
svo = prsvec_1.prso;
|
|
/* !SAVE PARSER. */
|
|
svi = prsvec_1.prsi;
|
|
prsvec_1.prsa = vindex_1.takew;
|
|
prsvec_1.prsi = 0;
|
|
if (! take_(0)) {
|
|
return ret_val;
|
|
}
|
|
/* !TAKE OBJECT. */
|
|
prsvec_1.prsa = vindex_1.putw;
|
|
prsvec_1.prso = svo;
|
|
prsvec_1.prsi = svi;
|
|
goto L1000;
|
|
|
|
/* NOW SEE IF OBJECT IS ON PERSON. */
|
|
|
|
L800:
|
|
if (objcts_1.ocan[prsvec_1.prso - 1] == 0) {
|
|
goto L1000;
|
|
}
|
|
/* !INSIDE? */
|
|
if ((objcts_1.oflag2[objcts_1.ocan[prsvec_1.prso - 1] - 1] &
|
|
OPENBT) != 0) {
|
|
goto L900;
|
|
}
|
|
/* !OPEN? */
|
|
rspsub_(566, objcts_1.odesc2[prsvec_1.prso - 1]);
|
|
/* !LOSE. */
|
|
return ret_val;
|
|
|
|
L900:
|
|
scrupd_(objcts_1.ofval[prsvec_1.prso - 1]);
|
|
/* !SCORE OBJECT. */
|
|
objcts_1.ofval[prsvec_1.prso - 1] = 0;
|
|
objcts_1.oflag2[prsvec_1.prso - 1] |= TCHBT;
|
|
newsta_(prsvec_1.prso, 0, 0, 0, play_1.winner);
|
|
/* !TEMPORARILY ON WINNER. */
|
|
|
|
L1000:
|
|
if (objact_()) {
|
|
return ret_val;
|
|
}
|
|
/* !NO, GIVE OBJECT A SHOT. */
|
|
newsta_(prsvec_1.prso, 2, 0, prsvec_1.prsi, 0);
|
|
/* !CONTAINED INSIDE. */
|
|
ret_val = TRUE_;
|
|
return ret_val;
|
|
|
|
} /* put_ */
|
|
|
|
/* VALUAC- HANDLES VALUABLES/EVERYTHING */
|
|
|
|
void valuac_(v)
|
|
integer v;
|
|
{
|
|
/* System generated locals */
|
|
integer i__1;
|
|
|
|
/* Local variables */
|
|
logical f;
|
|
integer i;
|
|
logical f1;
|
|
integer savep, saveh;
|
|
|
|
f = TRUE_;
|
|
/* !ASSUME NO ACTIONS. */
|
|
i = 579;
|
|
/* !ASSUME NOT LIT. */
|
|
if (! lit_(play_1.here)) {
|
|
goto L4000;
|
|
}
|
|
/* !IF NOT LIT, PUNT. */
|
|
i = 677;
|
|
/* !ASSUME WRONG VERB. */
|
|
savep = prsvec_1.prso;
|
|
/* !SAVE PRSO. */
|
|
saveh = play_1.here;
|
|
/* !SAVE HERE. */
|
|
|
|
/* L100: */
|
|
if (prsvec_1.prsa != vindex_1.takew) {
|
|
goto L1000;
|
|
}
|
|
/* !TAKE EVERY/VALUA? */
|
|
i__1 = objcts_1.olnt;
|
|
for (prsvec_1.prso = 1; prsvec_1.prso <= i__1; ++prsvec_1.prso) {
|
|
/* !LOOP THRU OBJECTS. */
|
|
if (! qhere_(prsvec_1.prso, play_1.here) || (objcts_1.oflag1[
|
|
prsvec_1.prso - 1] & VISIBT) == 0 || (
|
|
objcts_1.oflag2[prsvec_1.prso - 1] & ACTRBT) != 0 ||
|
|
savep == v && objcts_1.otval[prsvec_1.prso - 1] <= 0) {
|
|
goto L500;
|
|
}
|
|
if ((objcts_1.oflag1[prsvec_1.prso - 1] & TAKEBT) == 0 && (
|
|
objcts_1.oflag2[prsvec_1.prso - 1] & TRYBT) == 0) {
|
|
goto L500;
|
|
}
|
|
f = FALSE_;
|
|
rspsub_(580, objcts_1.odesc2[prsvec_1.prso - 1]);
|
|
f1 = take_(1);
|
|
if (saveh != play_1.here) {
|
|
return;
|
|
}
|
|
L500:
|
|
;
|
|
}
|
|
goto L3000;
|
|
|
|
L1000:
|
|
if (prsvec_1.prsa != vindex_1.dropw) {
|
|
goto L2000;
|
|
}
|
|
/* !DROP EVERY/VALUA? */
|
|
i__1 = objcts_1.olnt;
|
|
for (prsvec_1.prso = 1; prsvec_1.prso <= i__1; ++prsvec_1.prso) {
|
|
if (objcts_1.oadv[prsvec_1.prso - 1] != play_1.winner || savep == v
|
|
&& objcts_1.otval[prsvec_1.prso - 1] <= 0) {
|
|
goto L1500;
|
|
}
|
|
f = FALSE_;
|
|
rspsub_(580, objcts_1.odesc2[prsvec_1.prso - 1]);
|
|
f1 = drop_(1);
|
|
if (saveh != play_1.here) {
|
|
return;
|
|
}
|
|
L1500:
|
|
;
|
|
}
|
|
goto L3000;
|
|
|
|
L2000:
|
|
if (prsvec_1.prsa != vindex_1.putw) {
|
|
goto L3000;
|
|
}
|
|
/* !PUT EVERY/VALUA? */
|
|
i__1 = objcts_1.olnt;
|
|
for (prsvec_1.prso = 1; prsvec_1.prso <= i__1; ++prsvec_1.prso) {
|
|
/* !LOOP THRU OBJECTS. */
|
|
if (objcts_1.oadv[prsvec_1.prso - 1] != play_1.winner ||
|
|
prsvec_1.prso == prsvec_1.prsi || savep == v &&
|
|
objcts_1.otval[prsvec_1.prso - 1] <= 0 || (objcts_1.oflag1[
|
|
prsvec_1.prso - 1] & VISIBT) == 0) {
|
|
goto L2500;
|
|
}
|
|
f = FALSE_;
|
|
rspsub_(580, objcts_1.odesc2[prsvec_1.prso - 1]);
|
|
f1 = put_(1);
|
|
if (saveh != play_1.here) {
|
|
return;
|
|
}
|
|
L2500:
|
|
;
|
|
}
|
|
|
|
L3000:
|
|
i = 581;
|
|
if (savep == v) {
|
|
i = 582;
|
|
}
|
|
/* !CHOOSE MESSAGE. */
|
|
L4000:
|
|
if (f) {
|
|
rspeak_(i);
|
|
}
|
|
/* !IF NOTHING, REPORT. */
|
|
} /* valuac_ */
|