mirror of https://github.com/sean-m/zork
189 lines
3.4 KiB
C
189 lines
3.4 KiB
C
/*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"
|
|
|
|
/* GTTIME-- GET TOTAL TIME PLAYED */
|
|
|
|
void gttime_(t)
|
|
integer *t;
|
|
{
|
|
integer h, m, s;
|
|
|
|
itime_(&h, &m, &s);
|
|
*t = h * 60 + m - (time_1.shour * 60 + time_1.smin);
|
|
if (*t < 0) {
|
|
*t += 1440;
|
|
}
|
|
*t += time_1.pltime;
|
|
return;
|
|
} /* gttime_ */
|
|
|
|
/* OPNCLS-- PROCESS OPEN/CLOSE FOR DOORS */
|
|
|
|
/* DECLARATIONS */
|
|
|
|
logical opncls_(obj, so, sc)
|
|
integer obj;
|
|
integer so;
|
|
integer sc;
|
|
{
|
|
/* System generated locals */
|
|
integer i__1;
|
|
logical ret_val;
|
|
|
|
ret_val = TRUE_;
|
|
/* !ASSUME WINS. */
|
|
if (prsvec_1.prsa == vindex_1.closew) {
|
|
goto L100;
|
|
}
|
|
/* !CLOSE? */
|
|
if (prsvec_1.prsa == vindex_1.openw) {
|
|
goto L50;
|
|
}
|
|
/* !OPEN? */
|
|
ret_val = FALSE_;
|
|
/* !LOSE */
|
|
return ret_val;
|
|
|
|
L50:
|
|
if ((objcts_1.oflag2[obj - 1] & OPENBT) != 0) {
|
|
goto L200;
|
|
}
|
|
/* !OPEN... IS IT? */
|
|
rspeak_(so);
|
|
objcts_1.oflag2[obj - 1] |= OPENBT;
|
|
return ret_val;
|
|
|
|
L100:
|
|
if (! ((objcts_1.oflag2[obj - 1] & OPENBT) != 0)) {
|
|
goto L200;
|
|
}
|
|
/* !CLOSE... IS IT? */
|
|
rspeak_(sc);
|
|
objcts_1.oflag2[obj - 1] &= ~ OPENBT;
|
|
return ret_val;
|
|
|
|
L200:
|
|
i__1 = rnd_(3) + 125;
|
|
rspeak_(i__1);
|
|
/* !DUMMY. */
|
|
return ret_val;
|
|
} /* opncls_ */
|
|
|
|
/* LIT-- IS ROOM LIT? */
|
|
|
|
/* DECLARATIONS */
|
|
|
|
logical lit_(rm)
|
|
integer rm;
|
|
{
|
|
/* System generated locals */
|
|
integer i__1, i__2;
|
|
logical ret_val;
|
|
|
|
/* Local variables */
|
|
integer i, j, oa;
|
|
|
|
ret_val = TRUE_;
|
|
/* !ASSUME WINS */
|
|
if ((rooms_1.rflag[rm - 1] & RLIGHT) != 0) {
|
|
return ret_val;
|
|
}
|
|
|
|
i__1 = objcts_1.olnt;
|
|
for (i = 1; i <= i__1; ++i) {
|
|
/* !LOOK FOR LIT OBJ */
|
|
if (qhere_(i, rm)) {
|
|
goto L100;
|
|
}
|
|
/* !IN ROOM? */
|
|
oa = objcts_1.oadv[i - 1];
|
|
/* !NO */
|
|
if (oa <= 0) {
|
|
goto L1000;
|
|
}
|
|
/* !ON ADV? */
|
|
if (advs_1.aroom[oa - 1] != rm) {
|
|
goto L1000;
|
|
}
|
|
/* !ADV IN ROOM? */
|
|
|
|
/* OBJ IN ROOM OR ON ADV IN ROOM */
|
|
|
|
L100:
|
|
if ((objcts_1.oflag1[i - 1] & ONBT) != 0) {
|
|
return ret_val;
|
|
}
|
|
if ((objcts_1.oflag1[i - 1] & VISIBT) == 0 || (
|
|
objcts_1.oflag1[i - 1] & TRANBT) == 0 && (
|
|
objcts_1.oflag2[i - 1] & OPENBT) == 0) {
|
|
goto L1000;
|
|
}
|
|
|
|
/* OBJ IS VISIBLE AND OPEN OR TRANSPARENT */
|
|
|
|
i__2 = objcts_1.olnt;
|
|
for (j = 1; j <= i__2; ++j) {
|
|
if (objcts_1.ocan[j - 1] == i && (objcts_1.oflag1[j - 1] &
|
|
ONBT) != 0) {
|
|
return ret_val;
|
|
}
|
|
/* L500: */
|
|
}
|
|
L1000:
|
|
;
|
|
}
|
|
ret_val = FALSE_;
|
|
return ret_val;
|
|
} /* lit_ */
|
|
|
|
/* WEIGHT- RETURNS SUM OF WEIGHT OF QUALIFYING OBJECTS */
|
|
|
|
/* DECLARATIONS */
|
|
|
|
integer weight_(rm, cn, ad)
|
|
integer rm;
|
|
integer cn;
|
|
integer ad;
|
|
{
|
|
/* System generated locals */
|
|
integer ret_val, i__1;
|
|
|
|
/* Local variables */
|
|
integer i, j;
|
|
|
|
ret_val = 0;
|
|
i__1 = objcts_1.olnt;
|
|
for (i = 1; i <= i__1; ++i) {
|
|
/* !OMIT BIG FIXED ITEMS. */
|
|
if (objcts_1.osize[i - 1] >= 10000) {
|
|
goto L100;
|
|
}
|
|
/* !IF FIXED, FORGET IT. */
|
|
if (qhere_(i, rm) && rm != 0 || objcts_1.oadv[i - 1] == ad && ad
|
|
!= 0) {
|
|
goto L50;
|
|
}
|
|
j = i;
|
|
/* !SEE IF CONTAINED. */
|
|
L25:
|
|
j = objcts_1.ocan[j - 1];
|
|
/* !GET NEXT LEVEL UP. */
|
|
if (j == 0) {
|
|
goto L100;
|
|
}
|
|
/* !END OF LIST? */
|
|
if (j != cn) {
|
|
goto L25;
|
|
}
|
|
L50:
|
|
ret_val += objcts_1.osize[i - 1];
|
|
L100:
|
|
;
|
|
}
|
|
return ret_val;
|
|
} /* weight_ */
|