[comp.sources.games] v12i077: cdungeon - C language port of DECUS dungeon, Part10/12

billr@saab.CNA.TEK.COM (Bill Randle) (05/15/91)

Submitted-by: ian@airs.COM
Posting-number: Volume 12, Issue 77
Archive-name: cdungeon/Part10
Environment: Unix, MS-DOS



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 10 (of 12)."
# Contents:  dinit.c dsub.c np.c np3.c nrooms.c
# Wrapped by billr@saab on Tue May 14 16:27:43 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'dinit.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dinit.c'\"
else
echo shar: Extracting \"'dinit.c'\" \(12402 characters\)
sed "s/^X//" >'dinit.c' <<'END_OF_FILE'
X/* INIT-- DUNGEON INITIALIZATION SUBROUTINE */
X
X/*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
X/* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
X/* WRITTEN BY R. M. SUPNIK */
X
X#include <stdio.h>
X
X#ifdef __AMOS__
X#include <amos.h>
X#endif
X
X#include "funcs.h"
X#include "vars.h"
X
X/* This is here to avoid depending on the existence of <stdlib.h> */
X
Xextern void srand P((unsigned int));
X
XFILE *dbfile;
X
X#ifndef TEXTFILE
X#ifdef __AMOS__
X#define TEXTFILE "lib:dtextc.dat"
X#else /* ! __AMOS__ */
X#ifdef unix
X#define TEXTFILE "/usr/games/lib/dunlib/dtextc.dat"
X#else /* ! unix */
X I need a definition for TEXTFILE
X#endif /* ! unix */
X#endif /* ! __AMOS__ */
X#endif /* ! TEXTFILE */
X
X#ifndef LOCALTEXTFILE
X#define LOCALTEXTFILE "dtextc.dat"
X#endif
X
X/* Read a single two byte integer from the index file */
X
X#define rdint(indxfile) \
X    (ch = getc(indxfile), \
X     ((ch > 127) ? (ch - 256) : (ch)) * 256 + getc(indxfile))
X
X/* Read a number of two byte integers from the index file */
X
Xstatic void rdints(c, pi, indxfile)
Xinteger c;
Xinteger *pi;
XFILE *indxfile;
X{
X    integer ch;	/* Local variable for rdint */
X
X    while (c-- != 0)
X	*pi++ = rdint(indxfile);
X}
X
X/* Read a partial array of integers.  These are stored as index,value
X * pairs.
X */
X
Xstatic void rdpartialints(c, pi, indxfile)
Xinteger c;
Xinteger *pi;
XFILE *indxfile;
X{
X    integer ch;	/* Local variable for rdint */
X
X    while (1) {
X	int i;
X
X	if (c < 255) {
X	    i = getc(indxfile);
X	    if (i == 255)
X		return;
X	}
X	else {
X	    i = rdint(indxfile);
X	    if (i == -1)
X		return;
X	}
X
X	pi[i] = rdint(indxfile);
X    }
X}
X
X/* Read a number of one byte flags from the index file */
X
Xstatic void rdflags(c, pf, indxfile)
Xinteger c;
Xlogical *pf;
XFILE *indxfile;
X{
X    while (c-- != 0)
X	*pf++ = getc(indxfile);
X}
X
Xlogical init_()
X{
X    /* System generated locals */
X    integer i__1;
X    logical ret_val;
X
X    /* Local variables */
X    integer xmax, r2max, dirmax, recno;
X    integer i, j, k;
X    register integer ch;
X    register FILE *indxfile;
X    integer mmax, omax, rmax, vmax, amax, cmax, fmax, smax;
X
X    more_init();
X
X/* FIRST CHECK FOR PROTECTION VIOLATION */
X
X    if (protected()) {
X	goto L10000;
X    }
X/* 						!PROTECTION VIOLATION? */
X    more_output("There appears before you a threatening figure clad all over");
X    more_output("in heavy black armor.  His legs seem like the massive trunk");
X    more_output("of the oak tree.  His broad shoulders and helmeted head loom");
X    more_output("high over your own puny frame, and you realize that his powerful");
X    more_output("arms could easily crush the very life from your body.  There");
X    more_output("hangs from his belt a veritable arsenal of deadly weapons:");
X    more_output("sword, mace, ball and chain, dagger, lance, and trident.");
X    more_output("He speaks with a commanding voice:");
X    more_output("");
X    more_output("                    \"You shall not pass.\"");
X    more_output("");
X    more_output("As he grabs you by the neck all grows dim about you.");
X    exit_();
X
X/* NOW START INITIALIZATION PROPER */
X
XL10000:
X    ret_val = FALSE_;
X/* 						!ASSUME INIT FAILS. */
X    mmax = 1050;
X/* 						!SET UP ARRAY LIMITS. */
X    omax = 220;
X    rmax = 200;
X    vmax = 4;
X    amax = 4;
X    cmax = 25;
X    fmax = 46;
X    smax = 22;
X    xmax = 900;
X    r2max = 20;
X    dirmax = 15;
X
X    rmsg_1.mlnt = 0;
X/* 						!INIT ARRAY COUNTERS. */
X    objcts_1.olnt = 0;
X    rooms_1.rlnt = 0;
X    vill_1.vlnt = 0;
X    advs_1.alnt = 0;
X    cevent_1.clnt = 0;
X    exits_1.xlnt = 1;
X    oroom2_1.r2lnt = 0;
X
X    state_1.ltshft = 10;
X/* 						!SET UP STATE VARIABLES. */
X    state_1.mxscor = state_1.ltshft;
X    state_1.egscor = 0;
X    state_1.egmxsc = 0;
X    state_1.mxload = 100;
X    state_1.rwscor = 0;
X    state_1.deaths = 0;
X    state_1.moves = 0;
X    time_1.pltime = 0;
X    state_1.mungrm = 0;
X    state_1.hs = 0;
X    prsvec_1.prsa = 0;
X/* 						!CLEAR PARSE VECTOR. */
X    prsvec_1.prsi = 0;
X    prsvec_1.prso = 0;
X    prsvec_1.prscon = 1;
X    orphs_1.oflag = 0;
X/* 						!CLEAR ORPHANS. */
X    orphs_1.oact = 0;
X    orphs_1.oslot = 0;
X    orphs_1.oprep = 0;
X    orphs_1.oname = 0;
X    hack_1.thfflg = FALSE_;
X/* 						!THIEF NOT INTRODUCED BUT */
X    hack_1.thfact = TRUE_;
X/* 						!IS ACTIVE. */
X    hack_1.swdact = FALSE_;
X/* 						!SWORD IS INACTIVE. */
X    hack_1.swdsta = 0;
X/* 						!SWORD IS OFF. */
X
X    recno = 1;
X/* 						!INIT DB FILE POINTER. */
X    star_1.mbase = 0;
X/* 						!INIT MELEE BASE. */
X/* INIT, PAGE 3 */
X
X/* INIT ALL ARRAYS. */
X
X    i__1 = cmax;
X    for (i = 1; i <= i__1; ++i) {
X/* 						!CLEAR CLOCK EVENTS */
X	cevent_1.cflag[i - 1] = FALSE_;
X	cevent_1.ctick[i - 1] = 0;
X	cevent_1.cactio[i - 1] = 0;
X/* L5: */
X    }
X
X    i__1 = fmax;
X    for (i = 1; i <= i__1; ++i) {
X/* 						!CLEAR FLAGS. */
X	flags[i - 1] = FALSE_;
X/* L10: */
X    }
X    findex_1.buoyf = TRUE_;
X/* 						!SOME START AS TRUE. */
X    findex_1.egyptf = TRUE_;
X    findex_1.cagetf = TRUE_;
X    findex_1.mr1f = TRUE_;
X    findex_1.mr2f = TRUE_;
X    findex_1.follwf = TRUE_;
X    i__1 = smax;
X    for (i = 1; i <= i__1; ++i) {
X/* 						!CLEAR SWITCHES. */
X	switch_[i - 1] = 0;
X/* L12: */
X    }
X    findex_1.ormtch = 4;
X/* 						!NUMBER OF MATCHES. */
X    findex_1.lcell = 1;
X    findex_1.pnumb = 1;
X    findex_1.mdir = 270;
X    findex_1.mloc = rindex_1.mrb;
X    findex_1.cphere = 10;
X
X    i__1 = r2max;
X    for (i = 1; i <= i__1; ++i) {
X/* 						!CLEAR ROOM 2 ARRAY. */
X	oroom2_1.rroom2[i - 1] = 0;
X	oroom2_1.oroom2[i - 1] = 0;
X/* L15: */
X    }
X
X    i__1 = xmax;
X    for (i = 1; i <= i__1; ++i) {
X/* 						!CLEAR TRAVEL ARRAY. */
X	exits_1.travel[i - 1] = 0;
X/* L20: */
X    }
X
X    i__1 = vmax;
X    for (i = 1; i <= i__1; ++i) {
X/* 						!CLEAR VILLAINS ARRAYS. */
X	vill_1.vopps[i - 1] = 0;
X	vill_1.vprob[i - 1] = 0;
X	vill_1.villns[i - 1] = 0;
X	vill_1.vbest[i - 1] = 0;
X	vill_1.vmelee[i - 1] = 0;
X/* L30: */
X    }
X
X    i__1 = omax;
X    for (i = 1; i <= i__1; ++i) {
X/* 						!CLEAR OBJECT ARRAYS. */
X	objcts_1.odesc1[i - 1] = 0;
X	objcts_1.odesc2[i - 1] = 0;
X	objcts_1.odesco[i - 1] = 0;
X	objcts_1.oread[i - 1] = 0;
X	objcts_1.oactio[i - 1] = 0;
X	objcts_1.oflag1[i - 1] = 0;
X	objcts_1.oflag2[i - 1] = 0;
X	objcts_1.ofval[i - 1] = 0;
X	objcts_1.otval[i - 1] = 0;
X	objcts_1.osize[i - 1] = 0;
X	objcts_1.ocapac[i - 1] = 0;
X	objcts_1.ocan[i - 1] = 0;
X	objcts_1.oadv[i - 1] = 0;
X	objcts_1.oroom[i - 1] = 0;
X/* L40: */
X    }
X
X    i__1 = rmax;
X    for (i = 1; i <= i__1; ++i) {
X/* 						!CLEAR ROOM ARRAYS. */
X	rooms_1.rdesc1[i - 1] = 0;
X	rooms_1.rdesc2[i - 1] = 0;
X	rooms_1.ractio[i - 1] = 0;
X	rooms_1.rflag[i - 1] = 0;
X	rooms_1.rval[i - 1] = 0;
X	rooms_1.rexit[i - 1] = 0;
X/* L50: */
X    }
X
X    i__1 = mmax;
X    for (i = 1; i <= i__1; ++i) {
X/* 						!CLEAR MESSAGE DIRECTORY. */
X	rmsg_1.rtext[i - 1] = 0;
X/* L60: */
X    }
X
X    i__1 = amax;
X    for (i = 1; i <= i__1; ++i) {
X/* 						!CLEAR ADVENTURER'S ARRAYS. */
X	advs_1.aroom[i - 1] = 0;
X	advs_1.ascore[i - 1] = 0;
X	advs_1.avehic[i - 1] = 0;
X	advs_1.aobj[i - 1] = 0;
X	advs_1.aactio[i - 1] = 0;
X	advs_1.astren[i - 1] = 0;
X	advs_1.aflag[i - 1] = 0;
X/* L70: */
X    }
X
X    debug_1.dbgflg = 0;
X    debug_1.prsflg = 0;
X    debug_1.gdtflg = 0;
X
X#ifdef ALLOW_GDT
X
X/* allow setting gdtflg true if user id matches wizard id */
X/* this way, the wizard doesn't have to recompile to use gdt */
X
X    if (wizard()) {
X	debug_1.gdtflg = 1;
X    }
X
X#endif /* ALLOW_GDT */
X
X    screen_1.fromdr = 0;
X/* 						!INIT SCOL GOODIES. */
X    screen_1.scolrm = 0;
X    screen_1.scolac = 0;
X/* INIT, PAGE 4 */
X
X/* NOW RESTORE FROM EXISTING INDEX FILE. */
X
X#ifdef __AMOS__
X    if ((dbfile = fdopen(ropen(LOCALTEXTFILE, 0), BINREAD)) == NULL &&
X	(dbfile = fdopen(ropen(TEXTFILE, 0), BINREAD)) == NULL)
X#else
X    if ((dbfile = fopen(LOCALTEXTFILE, BINREAD)) == NULL &&
X	(dbfile = fopen(TEXTFILE, BINREAD)) == NULL)
X#endif
X	goto L1950;
X
X    indxfile = dbfile;
X
X    i = rdint(indxfile);
X    j = rdint(indxfile);
X    k = rdint(indxfile);
X
X/* 						!GET VERSION. */
X    if (i != vers_1.vmaj || j != vers_1.vmin) {
X	goto L1925;
X    }
X
X    state_1.mxscor = rdint(indxfile);
X    star_1.strbit = rdint(indxfile);
X    state_1.egmxsc = rdint(indxfile);
X
X    rooms_1.rlnt = rdint(indxfile);
X    rdints(rooms_1.rlnt, &rooms_1.rdesc1[0], indxfile);
X    rdints(rooms_1.rlnt, &rooms_1.rdesc2[0], indxfile);
X    rdints(rooms_1.rlnt, &rooms_1.rexit[0], indxfile);
X    rdpartialints(rooms_1.rlnt, &rooms_1.ractio[0], indxfile);
X    rdpartialints(rooms_1.rlnt, &rooms_1.rval[0], indxfile);
X    rdints(rooms_1.rlnt, &rooms_1.rflag[0], indxfile);
X
X    exits_1.xlnt = rdint(indxfile);
X    rdints(exits_1.xlnt, &exits_1.travel[0], indxfile);
X
X    objcts_1.olnt = rdint(indxfile);
X    rdints(objcts_1.olnt, &objcts_1.odesc1[0], indxfile);
X    rdints(objcts_1.olnt, &objcts_1.odesc2[0], indxfile);
X    rdpartialints(objcts_1.olnt, &objcts_1.odesco[0], indxfile);
X    rdpartialints(objcts_1.olnt, &objcts_1.oactio[0], indxfile);
X    rdints(objcts_1.olnt, &objcts_1.oflag1[0], indxfile);
X    rdpartialints(objcts_1.olnt, &objcts_1.oflag2[0], indxfile);
X    rdpartialints(objcts_1.olnt, &objcts_1.ofval[0], indxfile);
X    rdpartialints(objcts_1.olnt, &objcts_1.otval[0], indxfile);
X    rdints(objcts_1.olnt, &objcts_1.osize[0], indxfile);
X    rdpartialints(objcts_1.olnt, &objcts_1.ocapac[0], indxfile);
X    rdints(objcts_1.olnt, &objcts_1.oroom[0], indxfile);
X    rdpartialints(objcts_1.olnt, &objcts_1.oadv[0], indxfile);
X    rdpartialints(objcts_1.olnt, &objcts_1.ocan[0], indxfile);
X    rdpartialints(objcts_1.olnt, &objcts_1.oread[0], indxfile);
X
X    oroom2_1.r2lnt = rdint(indxfile);
X    rdints(oroom2_1.r2lnt, &oroom2_1.oroom2[0], indxfile);
X    rdints(oroom2_1.r2lnt, &oroom2_1.rroom2[0], indxfile);
X
X    cevent_1.clnt = rdint(indxfile);
X    rdints(cevent_1.clnt, &cevent_1.ctick[0], indxfile);
X    rdints(cevent_1.clnt, &cevent_1.cactio[0], indxfile);
X    rdflags(cevent_1.clnt, &cevent_1.cflag[0], indxfile);
X
X    vill_1.vlnt = rdint(indxfile);
X    rdints(vill_1.vlnt, &vill_1.villns[0], indxfile);
X    rdpartialints(vill_1.vlnt, &vill_1.vprob[0], indxfile);
X    rdpartialints(vill_1.vlnt, &vill_1.vopps[0], indxfile);
X    rdints(vill_1.vlnt, &vill_1.vbest[0], indxfile);
X    rdints(vill_1.vlnt, &vill_1.vmelee[0], indxfile);
X
X    advs_1.alnt = rdint(indxfile);
X    rdints(advs_1.alnt, &advs_1.aroom[0], indxfile);
X    rdpartialints(advs_1.alnt, &advs_1.ascore[0], indxfile);
X    rdpartialints(advs_1.alnt, &advs_1.avehic[0], indxfile);
X    rdints(advs_1.alnt, &advs_1.aobj[0], indxfile);
X    rdints(advs_1.alnt, &advs_1.aactio[0], indxfile);
X    rdints(advs_1.alnt, &advs_1.astren[0], indxfile);
X    rdpartialints(advs_1.alnt, &advs_1.aflag[0], indxfile);
X
X    star_1.mbase = rdint(indxfile);
X    rmsg_1.mlnt = rdint(indxfile);
X    rdints(rmsg_1.mlnt, &rmsg_1.rtext[0], indxfile);
X
X/* Save location of start of message text */
X    rmsg_1.mrloc = ftell(indxfile);
X
X/* 						!INIT DONE. */
X
X/* INIT, PAGE 5 */
X
X/* THE INTERNAL DATA BASE IS NOW ESTABLISHED. */
X/* SET UP TO PLAY THE GAME. */
X
X    itime_(&time_1.shour, &time_1.smin, &time_1.ssec);
X    srand(time_1.shour ^ (time_1.smin ^ time_1.ssec));
X
X    play_1.winner = aindex_1.player;
X    last_1.lastit = advs_1.aobj[aindex_1.player - 1];
X    play_1.here = advs_1.aroom[play_1.winner - 1];
X    hack_1.thfpos = objcts_1.oroom[oindex_1.thief - 1];
X    state_1.bloc = objcts_1.oroom[oindex_1.ballo - 1];
X    ret_val = TRUE_;
X
X    return ret_val;
X/* INIT, PAGE 6 */
X
X/* ERRORS-- INIT FAILS. */
X
XL1925:
X    more_output(NULL);
X    printf("%s is version %1d.%1d%c.\n", TEXTFILE, i, j, k);
X    more_output(NULL);
X    printf("I require version %1d.%1d%c.\n", vers_1.vmaj, vers_1.vmin,
X	   vers_1.vedit);
X    goto L1975;
XL1950:
X    more_output(NULL);
X    printf("I can't open %s.\n", TEXTFILE);
XL1975:
X    more_output("Suddenly a sinister, wraithlike figure appears before you,");
X    more_output("seeming to float in the air.  In a low, sorrowful voice he says,");
X    more_output("\"Alas, the very nature of the world has changed, and the dungeon");
X    more_output("cannot be found.  All must now pass away.\"  Raising his oaken staff");
X    more_output("in farewell, he fades into the spreading darkness.  In his place");
X    more_output("appears a tastefully lettered sign reading:");
X    more_output("");
X    more_output("                       INITIALIZATION FAILURE");
X    more_output("");
X    more_output("The darkness becomes all encompassing, and your vision fails.");
X    return ret_val;
X
X} /* init_ */
END_OF_FILE
if test 12402 -ne `wc -c <'dinit.c'`; then
    echo shar: \"'dinit.c'\" unpacked with wrong size!
fi
# end of 'dinit.c'
fi
if test -f 'dsub.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dsub.c'\"
else
echo shar: Extracting \"'dsub.c'\" \(12426 characters\)
sed "s/^X//" >'dsub.c' <<'END_OF_FILE'
X/* RESIDENT SUBROUTINES FOR DUNGEON */
X
X/*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
X/* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
X/* WRITTEN BY R. M. SUPNIK */
X
X#include <stdio.h>
X#include "funcs.h"
X#include "vars.h"
X
X#ifndef SEEK_SET
X#define SEEK_SET (0)
X#endif
X
Xextern FILE *dbfile;
X
Xstatic void rspsb2nl_ P((integer, integer, integer, logical));
X
X/* RSPEAK-- OUTPUT RANDOM MESSAGE ROUTINE */
X
X/* CALLED BY-- */
X
X/* 	CALL RSPEAK(MSGNUM) */
X
Xvoid rspeak_(n)
Xinteger n;
X{
X    rspsb2nl_(n, 0, 0, 1);
X} /* rspeak_ */
X
X/* RSPSUB-- OUTPUT RANDOM MESSAGE WITH SUBSTITUTABLE ARGUMENT */
X
X/* CALLED BY-- */
X
X/* 	CALL RSPSUB(MSGNUM,SUBNUM) */
X
Xvoid rspsub_(n, s1)
Xinteger n;
Xinteger s1;
X{
X    rspsb2nl_(n, s1, 0, 1);
X} /* rspsub_ */
X
X/* RSPSB2-- OUTPUT RANDOM MESSAGE WITH UP TO TWO SUBSTITUTABLE ARGUMENTS */
X
X/* CALLED BY-- */
X
X/* 	CALL RSPSB2(MSGNUM,SUBNUM1,SUBNUM2) */
X
Xvoid rspsb2_(n, s1, s2)
Xinteger n;
Xinteger s1;
Xinteger s2;
X{
X    rspsb2nl_(n, s1, s2, 1);
X} /* rspsb2_ */
X
X/* rspsb2nl_ Display a substitutable message with an optional newline */
X
Xstatic void rspsb2nl_(n, y, z, nl)
Xinteger n;
Xinteger y;
Xinteger z;
Xlogical nl;
X{
X    const char *zkey = "IanLanceTaylorJr";
X    long x;
X
X    x = (long)n;
X
X    if (x > 0) {
X	x = rmsg_1.rtext[x - 1];
X    }
X/* 						!IF >0, LOOK UP IN RTEXT. */
X    if (x == 0) {
X	return;
X    }
X/* 						!ANYTHING TO DO? */
X    play_1.telflg = TRUE_;
X/* 						!SAID SOMETHING. */
X
X    x = ((- x) - 1) * 8;
X    if (fseek(dbfile, x + (long)rmsg_1.mrloc, SEEK_SET) == EOF) {
X	fprintf(stderr, "Error seeking database loc %d\n", x);
X	exit_();
X    }
X
X    if (nl)
X	more_output(NULL);
X
X    while (1) {
X	integer i;
X
X	i = getc(dbfile);
X	if (i == EOF) {
X	    fprintf(stderr, "Error reading database loc %d\n", x);
X	    exit_();
X	}
X	i ^= zkey[x & 0xf] ^ (x & 0xff);
X	x = x + 1;
X	if (i == '\0')
X	    break;
X	else if (i == '\n') {
X	    putchar('\n');
X	    if (nl)
X		more_output(NULL);
X	}
X	else if (i == '#' && y != 0) {
X	    long iloc;
X
X	    iloc = ftell(dbfile);
X	    rspsb2nl_(y, 0, 0, 0);
X	    if (fseek(dbfile, iloc, SEEK_SET) == EOF) {
X		fprintf(stderr, "Error seeking database loc %d\n", iloc);
X		exit_();
X	    }
X	    y = z;
X	    z = 0;
X	}
X	else
X	    putchar(i);
X    }
X
X    if (nl)
X	putchar('\n');
X}
X
X/* OBJACT-- APPLY OBJECTS FROM PARSE VECTOR */
X
X/* DECLARATIONS */
X
Xlogical objact_()
X{
X    /* System generated locals */
X    logical ret_val;
X
X    ret_val = TRUE_;
X/* 						!ASSUME WINS. */
X    if (prsvec_1.prsi == 0) {
X	goto L100;
X    }
X/* 						!IND OBJECT? */
X    if (oappli_(objcts_1.oactio[prsvec_1.prsi - 1], 0)) {
X	return ret_val;
X    }
X/* 						!YES, LET IT HANDLE. */
X
XL100:
X    if (prsvec_1.prso == 0) {
X	goto L200;
X    }
X/* 						!DIR OBJECT? */
X    if (oappli_(objcts_1.oactio[prsvec_1.prso - 1], 0)) {
X	return ret_val;
X    }
X/* 						!YES, LET IT HANDLE. */
X
XL200:
X    ret_val = FALSE_;
X/* 						!LOSES. */
X    return ret_val;
X} /* objact_ */
X
X/* BUG-- REPORT FATAL SYSTEM ERROR */
X
X/* CALLED BY-- */
X
X/* 	CALL BUG(NO,PAR) */
X
Xvoid bug_(a, b)
Xinteger a;
Xinteger b;
X{
X    /* Local variables */
X
X    more_output(NULL);
X    printf("PROGRAM ERROR %d, PARAMETER=%d\n", a, b);
X
X    if (debug_1.dbgflg != 0) {
X	return;
X    }
X    exit_();
X
X} /* bug_ */
X
X/* NEWSTA-- SET NEW STATUS FOR OBJECT */
X
X/* CALLED BY-- */
X
X/* 	CALL NEWSTA(OBJECT,STRING,NEWROOM,NEWCON,NEWADV) */
X
Xvoid newsta_(o, r, rm, cn, ad)
Xinteger o;
Xinteger r;
Xinteger rm;
Xinteger cn;
Xinteger ad;
X{
X    rspeak_(r);
X    objcts_1.oroom[o - 1] = rm;
X    objcts_1.ocan[o - 1] = cn;
X    objcts_1.oadv[o - 1] = ad;
X} /* newsta_ */
X
X/* QHERE-- TEST FOR OBJECT IN ROOM */
X
X/* DECLARATIONS */
X
Xlogical qhere_(obj, rm)
Xinteger obj;
Xinteger rm;
X{
X    /* System generated locals */
X    integer i__1;
X    logical ret_val;
X
X    /* Local variables */
X    integer i;
X
X    ret_val = TRUE_;
X    if (objcts_1.oroom[obj - 1] == rm) {
X	return ret_val;
X    }
X/* 						!IN ROOM? */
X    i__1 = oroom2_1.r2lnt;
X    for (i = 1; i <= i__1; ++i) {
X/* 						!NO, SCH ROOM2. */
X	if (oroom2_1.oroom2[i - 1] == obj && oroom2_1.rroom2[i - 1] == rm) {
X
X	    return ret_val;
X	}
X/* L100: */
X    }
X    ret_val = FALSE_;
X/* 						!NOT PRESENT. */
X    return ret_val;
X} /* qhere_ */
X
X/* QEMPTY-- TEST FOR OBJECT EMPTY */
X
X/* DECLARATIONS */
X
Xlogical qempty_(obj)
Xinteger obj;
X{
X    /* System generated locals */
X    integer i__1;
X    logical ret_val;
X
X    /* Local variables */
X    integer i;
X
X    ret_val = FALSE_;
X/* 						!ASSUME LOSE. */
X    i__1 = objcts_1.olnt;
X    for (i = 1; i <= i__1; ++i) {
X	if (objcts_1.ocan[i - 1] == obj) {
X	    return ret_val;
X	}
X/* 						!INSIDE TARGET? */
X/* L100: */
X    }
X    ret_val = TRUE_;
X    return ret_val;
X} /* qempty_ */
X
X/* JIGSUP- YOU ARE DEAD */
X
X/* DECLARATIONS */
X
Xvoid jigsup_(desc)
Xinteger desc;
X{
X    /* Initialized data */
X
X    static const integer rlist[9] = { 8,6,36,35,34,4,34,6,5 };
X
X    /* System generated locals */
X    integer i__1;
X
X    /* Local variables */
X    integer nonofl;
X    logical f;
X    integer i, j;
X
X    rspeak_(desc);
X/* 						!DESCRIBE SAD STATE. */
X    prsvec_1.prscon = 1;
X/* 						!STOP PARSER. */
X    if (debug_1.dbgflg != 0) {
X	return;
X    }
X/* 						!IF DBG, EXIT. */
X    advs_1.avehic[play_1.winner - 1] = 0;
X/* 						!GET RID OF VEHICLE. */
X    if (play_1.winner == aindex_1.player) {
X	goto L100;
X    }
X/* 						!HIMSELF? */
X    rspsub_(432, objcts_1.odesc2[advs_1.aobj[play_1.winner - 1] - 1]);
X/* 						!NO, SAY WHO DIED. */
X    newsta_(advs_1.aobj[play_1.winner - 1], 0, 0, 0, 0);
X/* 						!SEND TO HYPER SPACE. */
X    return;
X
XL100:
X    if (findex_1.endgmf) {
X	goto L900;
X    }
X/* 						!NO RECOVERY IN END GAME. */
X    if (state_1.deaths >= 2) {
X	goto L1000;
X    }
X/* 						!DEAD TWICE? KICK HIM OFF. */
X    if (! yesno_(10, 9, 8)) {
X	goto L1100;
X    }
X/* 						!CONTINUE? */
X
X    i__1 = objcts_1.olnt;
X    for (j = 1; j <= i__1; ++j) {
X/* 						!TURN OFF FIGHTING. */
X	if (qhere_(j, play_1.here)) {
X	    objcts_1.oflag2[j - 1] &= ~ FITEBT;
X	}
X/* L50: */
X    }
X
X    ++state_1.deaths;
X    scrupd_(- 10);
X/* 						!CHARGE TEN POINTS. */
X    f = moveto_(rindex_1.fore1, play_1.winner);
X/* 						!REPOSITION HIM. */
X    findex_1.egyptf = TRUE_;
X/* 						!RESTORE COFFIN. */
X    if (objcts_1.oadv[oindex_1.coffi - 1] == play_1.winner) {
X	newsta_(oindex_1.coffi, 0, rindex_1.egypt, 0, 0);
X    }
X    objcts_1.oflag2[oindex_1.door - 1] &= ~ TCHBT;
X    objcts_1.oflag1[oindex_1.robot - 1] = (objcts_1.oflag1[oindex_1.robot - 1]
X	     | VISIBT) & ~ NDSCBT;
X    if (objcts_1.oroom[oindex_1.lamp - 1] != 0 || objcts_1.oadv[oindex_1.lamp 
X	    - 1] == play_1.winner) {
X	newsta_(oindex_1.lamp, 0, rindex_1.lroom, 0, 0);
X    }
X
X/* NOW REDISTRIBUTE HIS VALUABLES AND OTHER BELONGINGS. */
X
X/* THE LAMP HAS BEEN PLACED IN THE LIVING ROOM. */
X/* THE FIRST 8 NON-VALUABLES ARE PLACED IN LOCATIONS AROUND THE HOUSE. */
X/* HIS VALUABLES ARE PLACED AT THE END OF THE MAZE. */
X/* REMAINING NON-VALUABLES ARE PLACED AT THE END OF THE MAZE. */
X
X    i = 1;
X    i__1 = objcts_1.olnt;
X    for (j = 1; j <= i__1; ++j) {
X/* 						!LOOP THRU OBJECTS. */
X	if (objcts_1.oadv[j - 1] != play_1.winner || objcts_1.otval[j - 1] != 
X		0) {
X	    goto L200;
X	}
X	++i;
X	if (i > 9) {
X	    goto L400;
X	}
X/* 						!MOVE TO RANDOM LOCATIONS. */
X	newsta_(j, 0, rlist[i - 1], 0, 0);
XL200:
X	;
X    }
X
XL400:
X    i = rooms_1.rlnt + 1;
X/* 						!NOW MOVE VALUABLES. */
X    nonofl = RAIR + RWATER + RSACRD + REND;
X/* 						!DONT MOVE HERE. */
X    i__1 = objcts_1.olnt;
X    for (j = 1; j <= i__1; ++j) {
X	if (objcts_1.oadv[j - 1] != play_1.winner || objcts_1.otval[j - 1] == 
X		0) {
X	    goto L300;
X	}
XL250:
X	--i;
X/* 						!FIND NEXT ROOM. */
X	if ((rooms_1.rflag[i - 1] & nonofl) != 0) {
X	    goto L250;
X	}
X	newsta_(j, 0, i, 0, 0);
X/* 						!YES, MOVE. */
XL300:
X	;
X    }
X
X    i__1 = objcts_1.olnt;
X    for (j = 1; j <= i__1; ++j) {
X/* 						!NOW GET RID OF REMAINDER. */
X	if (objcts_1.oadv[j - 1] != play_1.winner) {
X	    goto L500;
X	}
XL450:
X	--i;
X/* 						!FIND NEXT ROOM. */
X	if ((rooms_1.rflag[i - 1] & nonofl) != 0) {
X	    goto L450;
X	}
X	newsta_(j, 0, i, 0, 0);
XL500:
X	;
X    }
X    return;
X
X/* CAN'T OR WON'T CONTINUE, CLEAN UP AND EXIT. */
X
XL900:
X    rspeak_(625);
X/* 						!IN ENDGAME, LOSE. */
X    goto L1100;
X
XL1000:
X    rspeak_(7);
X/* 						!INVOLUNTARY EXIT. */
XL1100:
X    score_(0);
X/* 						!TELL SCORE. */
X    (void) fclose(dbfile);
X    exit_();
X
X} /* jigsup_ */
X
X/* OACTOR-	GET ACTOR ASSOCIATED WITH OBJECT */
X
X/* DECLARATIONS */
X
Xinteger oactor_(obj)
Xinteger obj;
X{
X    /* System generated locals */
X    integer ret_val = 1, i__1;
X
X    /* Local variables */
X    integer i;
X
X    i__1 = advs_1.alnt;
X    for (i = 1; i <= i__1; ++i) {
X/* 						!LOOP THRU ACTORS. */
X	ret_val = i;
X/* 						!ASSUME FOUND. */
X	if (advs_1.aobj[i - 1] == obj) {
X	    return ret_val;
X	}
X/* 						!FOUND IT? */
X/* L100: */
X    }
X    bug_(40, obj);
X/* 						!NO, DIE. */
X    return ret_val;
X} /* oactor_ */
X
X/* PROB-		COMPUTE PROBABILITY */
X
X/* DECLARATIONS */
X
Xlogical prob_(g, b)
Xinteger g;
Xinteger b;
X{
X    /* System generated locals */
X    logical ret_val;
X
X    /* Local variables */
X    integer i;
X
X    i = g;
X/* 						!ASSUME GOOD LUCK. */
X    if (findex_1.badlkf) {
X	i = b;
X    }
X/* 						!IF BAD, TOO BAD. */
X    ret_val = rnd_(100) < i;
X/* 						!COMPUTE. */
X    return ret_val;
X} /* prob_ */
X
X/* RMDESC-- PRINT ROOM DESCRIPTION */
X
X/* RMDESC PRINTS A DESCRIPTION OF THE CURRENT ROOM. */
X/* IT IS ALSO THE PROCESSOR FOR VERBS 'LOOK' AND 'EXAMINE'. */
X
Xlogical rmdesc_(full)
Xinteger full;
X{
X    /* System generated locals */
X    logical ret_val, L__1;
X
X    /* Local variables */
X    integer i, ra;
X
X/* FULL=	0/1/2/3=	SHORT/OBJ/ROOM/FULL */
X
X    ret_val = TRUE_;
X/* 						!ASSUME WINS. */
X    if (prsvec_1.prso < xsrch_1.xmin) {
X	goto L50;
X    }
X/* 						!IF DIRECTION, */
X    screen_1.fromdr = prsvec_1.prso;
X/* 						!SAVE AND */
X    prsvec_1.prso = 0;
X/* 						!CLEAR. */
XL50:
X    if (play_1.here == advs_1.aroom[aindex_1.player - 1]) {
X	goto L100;
X    }
X/* 						!PLAYER JUST MOVE? */
X    rspeak_(2);
X/* 						!NO, JUST SAY DONE. */
X    prsvec_1.prsa = vindex_1.walkiw;
X/* 						!SET UP WALK IN ACTION. */
X    return ret_val;
X
XL100:
X    if (lit_(play_1.here)) {
X	goto L300;
X    }
X/* 						!LIT? */
X    rspeak_(430);
X/* 						!WARN OF GRUE. */
X    ret_val = FALSE_;
X    return ret_val;
X
XL300:
X    ra = rooms_1.ractio[play_1.here - 1];
X/* 						!GET ROOM ACTION. */
X    if (full == 1) {
X	goto L600;
X    }
X/* 						!OBJ ONLY? */
X    i = rooms_1.rdesc2[play_1.here - 1];
X/* 						!ASSUME SHORT DESC. */
X    if (full == 0 && (findex_1.superf || (rooms_1.rflag[play_1.here - 1] & 
X	    RSEEN) != 0 && findex_1.brieff)) {
X	goto L400;
X    }
X
X/*  The next line means that when you request VERBOSE mode, you */
X/*  only get long room descriptions 20% of the time. I don't either */
X/*  like or understand this, so the mod. ensures VERBOSE works */
X/*  all the time.			jmh@ukc.ac.uk 22/10/87 */
X
X/* &		        .AND.(BRIEFF.OR.PROB(80,80)))))       GO TO 400 */
X    i = rooms_1.rdesc1[play_1.here - 1];
X/* 						!USE LONG. */
X    if (i != 0 || ra == 0) {
X	goto L400;
X    }
X/* 						!IF GOT DESC, SKIP. */
X    prsvec_1.prsa = vindex_1.lookw;
X/* 						!PRETEND LOOK AROUND. */
X    if (! rappli_(ra)) {
X	goto L100;
X    }
X/* 						!ROOM HANDLES, NEW DESC? */
X    prsvec_1.prsa = vindex_1.foow;
X/* 						!NOP PARSER. */
X    goto L500;
X
XL400:
X    rspeak_(i);
X/* 						!OUTPUT DESCRIPTION. */
XL500:
X    if (advs_1.avehic[play_1.winner - 1] != 0) {
X	rspsub_(431, objcts_1.odesc2[advs_1.avehic[play_1.winner - 1] - 
X		1]);
X    }
X
XL600:
X    if (full != 2) {
X	L__1 = full != 0;
X	princr_(L__1, play_1.here);
X    }
X    rooms_1.rflag[play_1.here - 1] |= RSEEN;
X    if (full != 0 || ra == 0) {
X	return ret_val;
X    }
X/* 						!ANYTHING MORE? */
X    prsvec_1.prsa = vindex_1.walkiw;
X/* 						!GIVE HIM A SURPISE. */
X    if (! rappli_(ra)) {
X	goto L100;
X    }
X/* 						!ROOM HANDLES, NEW DESC? */
X    prsvec_1.prsa = vindex_1.foow;
X    return ret_val;
X
X} /* rmdesc_ */
X
X/* RAPPLI-	ROUTING ROUTINE FOR ROOM APPLICABLES */
X
X/* DECLARATIONS */
X
Xlogical rappli_(ri)
Xinteger ri;
X{
X    /* Initialized data */
X
X    const integer newrms = 38;
X
X    /* System generated locals */
X    logical ret_val;
X
X
X    ret_val = TRUE_;
X/* 						!ASSUME WINS. */
X    if (ri == 0) {
X	return ret_val;
X    }
X/* 						!IF ZERO, WIN. */
X    if (ri < newrms) {
X	ret_val = rappl1_(ri);
X    }
X/* 						!IF OLD, PROCESSOR 1. */
X    if (ri >= newrms) {
X	ret_val = rappl2_(ri);
X    }
X/* 						!IF NEW, PROCESSOR 2. */
X    return ret_val;
X} /* rappli_ */
END_OF_FILE
if test 12426 -ne `wc -c <'dsub.c'`; then
    echo shar: \"'dsub.c'\" unpacked with wrong size!
fi
# end of 'dsub.c'
fi
if test -f 'np.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'np.c'\"
else
echo shar: Extracting \"'np.c'\" \(5343 characters\)
sed "s/^X//" >'np.c' <<'END_OF_FILE'
X/* RDLINE-	READ INPUT LINE */
X
X/*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
X/* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
X/* WRITTEN BY R. M. SUPNIK */
X
X#include <stdio.h>
X#include <ctype.h>
X#include "funcs.h"
X#include "vars.h"
X
X/* This declaration is here since many systems don't have <stdlib.h> */
X
Xextern int system P((const char *));
X
Xstatic logical lex_ P((char *, integer *, integer *, logical));
X
Xvoid rdline_(buffer, who)
Xchar *buffer;
Xinteger who;
X{
X    /* Local variables */
X    char *z, *zlast;
X
X    /* Function Body */
XL5:
X    switch (who + 1) {
X	case 1:  goto L90;
X	case 2:  goto L10;
X    }
X/* 						!SEE WHO TO PROMPT FOR. */
XL10:
X    printf(">");
X/* 						!PROMPT FOR GAME. */
XL90:
X    (void) fflush(stdout);
X    if (fgets(buffer, 78, stdin) == NULL)
X	exit_();
X    more_input();
X
X    if (buffer[0] == '!') {
X	system(buffer + 1);
X	goto L5;
X    }
X
X    zlast = buffer - 1;
X    for (z = buffer; *z != '\0' && *z != '\n'; z++) {
X	if (*z != ' ')
X	    zlast = z;
X	if (islower(*z))
X		*z = toupper(*z);
X    }
X    z = zlast + 1;
X    if (z == buffer)
X	goto L5;
X    *z = '\0';
X
X    prsvec_1.prscon = 1;
X/* 						!RESTART LEX SCAN. */
X} /* rdline_ */
X
X/* PARSE-	TOP LEVEL PARSE ROUTINE */
X
X/* THIS ROUTINE DETAILS ON BIT 0 OF PRSFLG */
X
Xlogical parse_(inbuf, vbflag)
Xchar *inbuf;
Xlogical vbflag;
X{
X    /* System generated locals */
X    integer i__1;
X    logical ret_val;
X
X    /* Local variables */
X    integer outbuf[40], outlnt;
X
X    /* Parameter adjustments */
X    --inbuf;
X
X    /* Function Body */
X    ret_val = FALSE_;
X/* 						!ASSUME FAILS. */
X    prsvec_1.prsa = 0;
X/* 						!ZERO OUTPUTS. */
X    prsvec_1.prsi = 0;
X    prsvec_1.prso = 0;
X
X    if (! lex_(inbuf + 1, outbuf, &outlnt, vbflag)) {
X	goto L100;
X    }
X    if ((i__1 = sparse_(outbuf, outlnt, vbflag)) < 0) {
X	goto L100;
X    } else if (i__1 == 0) {
X	goto L200;
X    } else {
X	goto L300;
X    }
X/* 						!DO SYN SCAN. */
X
X/* PARSE REQUIRES VALIDATION */
X
XL200:
X    if (! (vbflag)) {
X	goto L350;
X    }
X/* 						!ECHO MODE, FORCE FAIL. */
X    if (! synmch_()) {
X	goto L100;
X    }
X/* 						!DO SYN MATCH. */
X    if (prsvec_1.prso > 0 & prsvec_1.prso < xsrch_1.xmin) {
X	last_1.lastit = prsvec_1.prso;
X    }
X
X/* SUCCESSFUL PARSE OR SUCCESSFUL VALIDATION */
X
XL300:
X    ret_val = TRUE_;
XL350:
X    orphan_(0, 0, 0, 0, 0);
X/* 						!CLEAR ORPHANS. */
X    return ret_val;
X
X/* PARSE FAILS, DISALLOW CONTINUATION */
X
XL100:
X    prsvec_1.prscon = 1;
X    return ret_val;
X
X} /* parse_ */
X
X/* ORPHAN- SET UP NEW ORPHANS */
X
X/* DECLARATIONS */
X
Xvoid orphan_(o1, o2, o3, o4, o5)
Xinteger o1;
Xinteger o2;
Xinteger o3;
Xinteger o4;
Xinteger o5;
X{
X    orphs_1.oflag = o1;
X/* 						!SET UP NEW ORPHANS. */
X    orphs_1.oact = o2;
X    orphs_1.oslot = o3;
X    orphs_1.oprep = o4;
X    orphs_1.oname = o5;
X} /* orphan_ */
X
X/* LEX-	LEXICAL ANALYZER */
X
X/* THIS ROUTINE DETAILS ON BIT 1 OF PRSFLAG */
X
Xstatic logical lex_(inbuf, outbuf, op, vbflag)
Xchar *inbuf;
Xinteger *outbuf;
Xinteger *op;
Xlogical vbflag;
X{
X    /* Initialized data */
X
X    static const char dlimit[9] = { 'A', 'Z', 'A' - 1,
X				    '1', '9', '1' - 31,
X				    '-', '-', '-' - 27 };
X
X    /* System generated locals */
X    logical ret_val;
X
X    /* Local variables */
X    integer i;
X    char j;
X    integer k, j1, j2, cp;
X
X    /* Parameter adjustments */
X    --outbuf;
X    --inbuf;
X
X    /* Function Body */
X
X    for (i = 1; i <= 40; ++i) {
X/* 						!CLEAR OUTPUT BUF. */
X	outbuf[i] = 0;
X/* L100: */
X    }
X
X    ret_val = FALSE_;
X/* 						!ASSUME LEX FAILS. */
X    *op = -1;
X/* 						!OUTPUT PTR. */
XL50:
X    *op += 2;
X/* 						!ADV OUTPUT PTR. */
X    cp = 0;
X/* 						!CHAR PTR=0. */
X
XL200:
X    j = inbuf[prsvec_1.prscon];
X/* 						!GET CHARACTER */
X
X    if (j == '\0')
X	goto L1000;
X/* 						!END OF INPUT? */
X
X    ++prsvec_1.prscon;
X/* 						!ADVANCE PTR. */
X
X    if (j == '.') {
X	goto L1000;
X    }
X/* 						!END OF COMMAND? */
X    if (j == ',') {
X	goto L1000;
X    }
X/* 						!END OF COMMAND? */
X    if (j == ' ') {
X	goto L6000;
X    }
X/* 						!SPACE? */
X    for (i = 1; i <= 9; i += 3) {
X/* 						!SCH FOR CHAR. */
X	if (j >= dlimit[i - 1] & j <= dlimit[i]) {
X	    goto L4000;
X	}
X/* L500: */
X    }
X
X    if (vbflag) {
X	rspeak_(601);
X    }
X/* 						!GREEK TO ME, FAIL. */
X    return ret_val;
X
X/* END OF INPUT, SEE IF PARTIAL WORD AVAILABLE. */
X
XL1000:
X    if (inbuf[prsvec_1.prscon] == '\0') {
X	prsvec_1.prscon = 1;
X    }
X/* 						!FORCE PARSE RESTART. */
X    if (cp == 0 & *op == 1) {
X	return ret_val;
X    }
X    if (cp == 0) {
X	*op += -2;
X    }
X/* 						!ANY LAST WORD? */
X    ret_val = TRUE_;
X    return ret_val;
X
X/* LEGITIMATE CHARACTERS: LETTER, DIGIT, OR HYPHEN. */
X
XL4000:
X    j1 = j - dlimit[i + 1];
X    if (cp >= 6) {
X	goto L200;
X    }
X/* 						!IGNORE IF TOO MANY CHAR. */
X    k = *op + cp / 3;
X/* 						!COMPUTE WORD INDEX. */
X    switch (cp % 3 + 1) {
X	case 1:  goto L4100;
X	case 2:  goto L4200;
X	case 3:  goto L4300;
X    }
X/* 						!BRANCH ON CHAR. */
XL4100:
X    j2 = j1 * 780;
X/* 						!CHAR 1... *780 */
X    outbuf[k] = outbuf[k] + j2 + j2;
X/* 						!*1560 (40 ADDED BELOW). */
XL4200:
X    outbuf[k] += j1 * 39;
X/* 						!*39 (1 ADDED BELOW). */
XL4300:
X    outbuf[k] += j1;
X/* 						!*1. */
X    ++cp;
X    goto L200;
X/* 						!GET NEXT CHAR. */
X
X/* SPACE */
X
XL6000:
X    if (cp == 0) {
X	goto L200;
X    }
X/* 						!ANY WORD YET? */
X    goto L50;
X/* 						!YES, ADV OP. */
X
X} /* lex_ */
END_OF_FILE
if test 5343 -ne `wc -c <'np.c'`; then
    echo shar: \"'np.c'\" unpacked with wrong size!
fi
# end of 'np.c'
fi
if test -f 'np3.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'np3.c'\"
else
echo shar: Extracting \"'np3.c'\" \(10123 characters\)
sed "s/^X//" >'np3.c' <<'END_OF_FILE'
X/* SYNMCH--	SYNTAX MATCHER */
X
X/*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
X/* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
X/* WRITTEN BY R. M. SUPNIK */
X
X#include "funcs.h"
X#include "vars.h"
X#include "parse.h"
X
Xstatic void unpack_ P((integer, integer *));
Xstatic integer gwim_ P((integer, integer, integer));
Xstatic logical syneql_ P((integer, integer, integer, integer, integer));
Xstatic logical takeit_ P((integer, integer));
X
X/* THIS ROUTINE DETAILS ON BIT 4 OF PRSFLG */
X
Xlogical synmch_()
X{
X    /* Initialized data */
X
X/*   THE FOLLOWING DATA STATEMENT WAS ORIGINALLY: */
X
X/* 	DATA R50MIN/1RA/ */
X
X    const integer r50min = 1600;
X
X    /* System generated locals */
X    integer i__1;
X    logical ret_val;
X
X    /* Local variables */
X    integer j;
X    integer newj;
X    integer drive, limit, qprep, sprep, dforce;
X
X    ret_val = FALSE_;
X    j = pv_1.act;
X/* 						!SET UP PTR TO SYNTAX. */
X    drive = 0;
X/* 						!NO DEFAULT. */
X    dforce = 0;
X/* 						!NO FORCED DEFAULT. */
X    qprep = orphs_1.oflag & orphs_1.oprep;
XL100:
X    j += 2;
X/* 						!FIND START OF SYNTAX. */
X    if (vvoc[j - 1] <= 0 || vvoc[j - 1] >= r50min) {
X	goto L100;
X    }
X    limit = j + vvoc[j - 1] + 1;
X/* 						!COMPUTE LIMIT. */
X    ++j;
X/* 						!ADVANCE TO NEXT. */
X
XL200:
X    unpack_(j, &newj);
X/* 						!UNPACK SYNTAX. */
X    sprep = syntax_1.dobj & VPMASK;
X    if (! syneql_(pv_1.p1, pv_1.o1, syntax_1.dobj, syntax_1.dfl1, 
X	    syntax_1.dfl2)) {
X	goto L1000;
X    }
X    sprep = syntax_1.iobj & VPMASK;
X    if (syneql_(pv_1.p2, pv_1.o2, syntax_1.iobj, syntax_1.ifl1, 
X	    syntax_1.ifl2)) {
X	goto L6000;
X    }
X
X/* SYNTAX MATCH FAILS, TRY NEXT ONE. */
X
X    if (pv_1.o2 != 0) {
X	goto L3000;
X    } else {
X	goto L500;
X    }
X/* 						!IF O2=0, SET DFLT. */
XL1000:
X    if (pv_1.o1 != 0) {
X	goto L3000;
X    } else {
X	goto L500;
X    }
X/* 						!IF O1=0, SET DFLT. */
XL500:
X    if (qprep == 0 || qprep == sprep) {
X	dforce = j;
X    }
X/* 						!IF PREP MCH. */
X    if ((syntax_1.vflag & SDRIV) != 0) {
X	drive = j;
X    }
XL3000:
X    j = newj;
X    if (j < limit) {
X	goto L200;
X    }
X/* 						!MORE TO DO? */
X/* SYNMCH, PAGE 2 */
X
X/* MATCH HAS FAILED.  IF DEFAULT SYNTAX EXISTS, TRY TO SNARF */
X/* ORPHANS OR GWIMS, OR MAKE NEW ORPHANS. */
X
X    if (drive == 0) {
X	drive = dforce;
X    }
X/* 						!NO DRIVER? USE FORCE. */
X    if (drive == 0) {
X	goto L10000;
X    }
X/* 						!ANY DRIVER? */
X    unpack_(drive, &dforce);
X/* 						!UNPACK DFLT SYNTAX. */
X
X/* TRY TO FILL DIRECT OBJECT SLOT IF THAT WAS THE PROBLEM. */
X
X    if ((syntax_1.vflag & SDIR) == 0 || pv_1.o1 != 0) {
X	goto L4000;
X    }
X
X/* FIRST TRY TO SNARF ORPHAN OBJECT. */
X
X    pv_1.o1 = orphs_1.oflag & orphs_1.oslot;
X    if (pv_1.o1 == 0) {
X	goto L3500;
X    }
X/* 						!ANY ORPHAN? */
X    if (syneql_(pv_1.p1, pv_1.o1, syntax_1.dobj, syntax_1.dfl1, 
X	    syntax_1.dfl2)) {
X	goto L4000;
X    }
X
X/* ORPHAN FAILS, TRY GWIM. */
X
XL3500:
X    pv_1.o1 = gwim_(syntax_1.dobj, syntax_1.dfw1, syntax_1.dfw2);
X/* 						!GET GWIM. */
X    if (pv_1.o1 > 0) {
X	goto L4000;
X    }
X/* 						!TEST RESULT. */
X    i__1 = syntax_1.dobj & VPMASK;
X    orphan_(- 1, pv_1.act, 0, i__1, 0);
X    rspeak_(623);
X    return ret_val;
X
X/* TRY TO FILL INDIRECT OBJECT SLOT IF THAT WAS THE PROBLEM. */
X
XL4000:
X    if ((syntax_1.vflag & SIND) == 0 || pv_1.o2 != 0) {
X	goto L6000;
X    }
X    pv_1.o2 = gwim_(syntax_1.iobj, syntax_1.ifw1, syntax_1.ifw2);
X/* 						!GWIM. */
X    if (pv_1.o2 > 0) {
X	goto L6000;
X    }
X    if (pv_1.o1 == 0) {
X	pv_1.o1 = orphs_1.oflag & orphs_1.oslot;
X    }
X    i__1 = syntax_1.dobj & VPMASK;
X    orphan_(- 1, pv_1.act, pv_1.o1, i__1, 0);
X    rspeak_(624);
X    return ret_val;
X
X/* TOTAL CHOMP */
X
XL10000:
X    rspeak_(601);
X/* 						!CANT DO ANYTHING. */
X    return ret_val;
X/* SYNMCH, PAGE 3 */
X
X/* NOW TRY TO TAKE INDIVIDUAL OBJECTS AND */
X/* IN GENERAL CLEAN UP THE PARSE VECTOR. */
X
XL6000:
X    if ((syntax_1.vflag & SFLIP) == 0) {
X	goto L5000;
X    }
X    j = pv_1.o1;
X/* 						!YES. */
X    pv_1.o1 = pv_1.o2;
X    pv_1.o2 = j;
X
XL5000:
X    prsvec_1.prsa = syntax_1.vflag & SVMASK;
X    prsvec_1.prso = pv_1.o1;
X/* 						!GET DIR OBJ. */
X    prsvec_1.prsi = pv_1.o2;
X/* 						!GET IND OBJ. */
X    if (! takeit_(prsvec_1.prso, syntax_1.dobj)) {
X	return ret_val;
X    }
X/* 						!TRY TAKE. */
X    if (! takeit_(prsvec_1.prsi, syntax_1.iobj)) {
X	return ret_val;
X    }
X/* 						!TRY TAKE. */
X    ret_val = TRUE_;
X    return ret_val;
X
X} /* synmch_ */
X
X/* UNPACK-	UNPACK SYNTAX SPECIFICATION, ADV POINTER */
X
X/* DECLARATIONS */
X
Xstatic void unpack_(oldj, j)
Xinteger oldj;
Xinteger *j;
X{
X    /* Local variables */
X    integer i;
X
X    for (i = 1; i <= 11; ++i) {
X/* 						!CLEAR SYNTAX. */
X	syn[i - 1] = 0;
X/* L10: */
X    }
X
X    syntax_1.vflag = vvoc[oldj - 1];
X    *j = oldj + 1;
X    if ((syntax_1.vflag & SDIR) == 0) {
X	return;
X    }
X    syntax_1.dfl1 = -1;
X/* 						!ASSUME STD. */
X    syntax_1.dfl2 = -1;
X    if ((syntax_1.vflag & SSTD) == 0) {
X	goto L100;
X    }
X    syntax_1.dfw1 = -1;
X/* 						!YES. */
X    syntax_1.dfw2 = -1;
X    syntax_1.dobj = VABIT + VRBIT + VFBIT;
X    goto L200;
X
XL100:
X    syntax_1.dobj = vvoc[*j - 1];
X/* 						!NOT STD. */
X    syntax_1.dfw1 = vvoc[*j];
X    syntax_1.dfw2 = vvoc[*j + 1];
X    *j += 3;
X    if ((syntax_1.dobj & VEBIT) == 0) {
X	goto L200;
X    }
X    syntax_1.dfl1 = syntax_1.dfw1;
X/* 						!YES. */
X    syntax_1.dfl2 = syntax_1.dfw2;
X
XL200:
X    if ((syntax_1.vflag & SIND) == 0) {
X	return;
X    }
X    syntax_1.ifl1 = -1;
X/* 						!ASSUME STD. */
X    syntax_1.ifl2 = -1;
X    syntax_1.iobj = vvoc[*j - 1];
X    syntax_1.ifw1 = vvoc[*j];
X    syntax_1.ifw2 = vvoc[*j + 1];
X    *j += 3;
X    if ((syntax_1.iobj & VEBIT) == 0) {
X	return;
X    }
X    syntax_1.ifl1 = syntax_1.ifw1;
X/* 						!YES. */
X    syntax_1.ifl2 = syntax_1.ifw2;
X} /* unpack_ */
X
X/* SYNEQL-	TEST FOR SYNTAX EQUALITY */
X
X/* DECLARATIONS */
X
Xstatic logical syneql_(prep, obj, sprep, sfl1, sfl2)
Xinteger prep;
Xinteger obj;
Xinteger sprep;
Xinteger sfl1;
Xinteger sfl2;
X{
X    /* System generated locals */
X    logical ret_val;
X
X    if (obj == 0) {
X	goto L100;
X    }
X/* 						!ANY OBJECT? */
X    ret_val = prep == (sprep & VPMASK) && (sfl1 & objcts_1.oflag1[
X	    obj - 1] | sfl2 & objcts_1.oflag2[obj - 1]) != 0;
X    return ret_val;
X
XL100:
X    ret_val = prep == 0 && sfl1 == 0 && sfl2 == 0;
X    return ret_val;
X
X} /* syneql_ */
X
X/* TAKEIT-	PARSER BASED TAKE OF OBJECT */
X
X/* DECLARATIONS */
X
Xstatic logical takeit_(obj, sflag)
Xinteger obj;
Xinteger sflag;
X{
X    /* System generated locals */
X    logical ret_val;
X
X    /* Local variables */
X    integer x;
X    integer odo2;
X
X/* TAKEIT, PAGE 2 */
X
X    ret_val = FALSE_;
X/* 						!ASSUME LOSES. */
X    if (obj == 0 || obj > star_1.strbit) {
X	goto L4000;
X    }
X/* 						!NULL/STARS WIN. */
X    odo2 = objcts_1.odesc2[obj - 1];
X/* 						!GET DESC. */
X    x = objcts_1.ocan[obj - 1];
X/* 						!GET CONTAINER. */
X    if (x == 0 || (sflag & VFBIT) == 0) {
X	goto L500;
X    }
X    if ((objcts_1.oflag2[x - 1] & OPENBT) != 0) {
X	goto L500;
X    }
X    rspsub_(566, odo2);
X/* 						!CANT REACH. */
X    return ret_val;
X
XL500:
X    if ((sflag & VRBIT) == 0) {
X	goto L1000;
X    }
X    if ((sflag & VTBIT) == 0) {
X	goto L2000;
X    }
X
X/* SHOULD BE IN ROOM (VRBIT NE 0) AND CAN BE TAKEN (VTBIT NE 0) */
X
X    if (schlst_(0, 0, play_1.here, 0, 0, obj) <= 0) {
X	goto L4000;
X    }
X/* 						!IF NOT, OK. */
X
X/* ITS IN THE ROOM AND CAN BE TAKEN. */
X
X    if ((objcts_1.oflag1[obj - 1] & TAKEBT) != 0 && (
X	    objcts_1.oflag2[obj - 1] & TRYBT) == 0) {
X	goto L3000;
X    }
X
X/* NOT TAKEABLE.  IF WE CARE, FAIL. */
X
X    if ((sflag & VCBIT) == 0) {
X	goto L4000;
X    }
X    rspsub_(445, odo2);
X    return ret_val;
X
X/* 1000--	IT SHOULD NOT BE IN THE ROOM. */
X/* 2000--	IT CANT BE TAKEN. */
X
XL2000:
X    if ((sflag & VCBIT) == 0) {
X	goto L4000;
X    }
XL1000:
X    if (schlst_(0, 0, play_1.here, 0, 0, obj) <= 0) {
X	goto L4000;
X    }
X    rspsub_(665, odo2);
X    return ret_val;
X/* TAKEIT, PAGE 3 */
X
X/* OBJECT IS IN THE ROOM, CAN BE TAKEN BY THE PARSER, */
X/* AND IS TAKEABLE IN GENERAL.  IT IS NOT A STAR. */
X/* TAKING IT SHOULD NOT HAVE SIDE AFFECTS. */
X/* IF IT IS INSIDE SOMETHING, THE CONTAINER IS OPEN. */
X/* THE FOLLOWING CODE IS LIFTED FROM SUBROUTINE TAKE. */
X
XL3000:
X    if (obj != advs_1.avehic[play_1.winner - 1]) {
X	goto L3500;
X    }
X/* 						!TAKE VEHICLE? */
X    rspeak_(672);
X    return ret_val;
X
XL3500:
X    if (x != 0 && objcts_1.oadv[x - 1] == play_1.winner || weight_(0, obj,
X	     play_1.winner) + objcts_1.osize[obj - 1] <= state_1.mxload) {
X	goto L3700;
X    }
X    rspeak_(558);
X/* 						!TOO BIG. */
X    return ret_val;
X
XL3700:
X    newsta_(obj, 559, 0, 0, play_1.winner);
X/* 						!DO TAKE. */
X    objcts_1.oflag2[obj - 1] |= TCHBT;
X    scrupd_(objcts_1.ofval[obj - 1]);
X    objcts_1.ofval[obj - 1] = 0;
X
XL4000:
X    ret_val = TRUE_;
X/* 						!SUCCESS. */
X    return ret_val;
X
X} /* takeit_ */
X
X/* GWIM- GET WHAT I MEAN IN AMBIGOUS SITUATIONS */
X
X/* DECLARATIONS */
X
Xstatic integer gwim_(sflag, sfw1, sfw2)
Xinteger sflag;
Xinteger sfw1;
Xinteger sfw2;
X{
X    /* System generated locals */
X    integer ret_val;
X
X    /* Local variables */
X    integer av;
X    integer nobj, robj;
X    logical nocare;
X
X/* GWIM, PAGE 2 */
X
X    ret_val = -1;
X/* 						!ASSUME LOSE. */
X    av = advs_1.avehic[play_1.winner - 1];
X    nobj = 0;
X    nocare = (sflag & VCBIT) == 0;
X
X/* FIRST SEARCH ADVENTURER */
X
X    if ((sflag & VABIT) != 0) {
X	nobj = fwim_(sfw1, sfw2, 0, 0, play_1.winner, nocare);
X    }
X    if ((sflag & VRBIT) != 0) {
X	goto L100;
X    }
XL50:
X    ret_val = nobj;
X    return ret_val;
X
X/* ALSO SEARCH ROOM */
X
XL100:
X    robj = fwim_(sfw1, sfw2, play_1.here, 0, 0, nocare);
X    if (robj < 0) {
X	goto L500;
X    } else if (robj == 0) {
X	goto L50;
X    } else {
X	goto L200;
X    }
X/* 						!TEST RESULT. */
X
X/* ROBJ > 0 */
X
XL200:
X    if (av == 0 || robj == av || (objcts_1.oflag2[robj - 1] & FINDBT)
X	     != 0) {
X	goto L300;
X    }
X    if (objcts_1.ocan[robj - 1] != av) {
X	goto L50;
X    }
X/* 						!UNREACHABLE? TRY NOBJ */
XL300:
X    if (nobj != 0) {
X	return ret_val;
X    }
X/* 						!IF AMBIGUOUS, RETURN. */
X    if (! takeit_(robj, sflag)) {
X	return ret_val;
X    }
X/* 						!IF UNTAKEABLE, RETURN */
X    ret_val = robj;
XL500:
X    return ret_val;
X
X} /* gwim_ */
END_OF_FILE
if test 10123 -ne `wc -c <'np3.c'`; then
    echo shar: \"'np3.c'\" unpacked with wrong size!
fi
# end of 'np3.c'
fi
if test -f 'nrooms.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'nrooms.c'\"
else
echo shar: Extracting \"'nrooms.c'\" \(10376 characters\)
sed "s/^X//" >'nrooms.c' <<'END_OF_FILE'
X/* RAPPL2- SPECIAL PURPOSE ROOM ROUTINES, PART 2 */
X
X/*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
X/* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
X/* WRITTEN BY R. M. SUPNIK */
X
X#include "funcs.h"
X#include "vars.h"
X
Xstatic void ewtell_ P((integer, integer));
Xstatic void lookto_ P((integer, integer, integer, integer, integer));
X
Xlogical rappl2_(ri)
Xinteger ri;
X{
X    /* Initialized data */
X
X    const integer newrms = 38;
X
X    /* System generated locals */
X    integer i__1;
X    logical ret_val;
X
X    /* Local variables */
X    integer i;
X    integer j;
X
X    ret_val = TRUE_;
X    switch (ri - newrms + 1) {
X	case 1:  goto L38000;
X	case 2:  goto L39000;
X	case 3:  goto L40000;
X	case 4:  goto L41000;
X	case 5:  goto L42000;
X	case 6:  goto L43000;
X	case 7:  goto L44000;
X	case 8:  goto L45000;
X	case 9:  goto L46000;
X	case 10:  goto L47000;
X	case 11:  goto L48000;
X	case 12:  goto L49000;
X	case 13:  goto L50000;
X	case 14:  goto L51000;
X	case 15:  goto L52000;
X	case 16:  goto L53000;
X	case 17:  goto L54000;
X	case 18:  goto L55000;
X	case 19:  goto L56000;
X	case 20:  goto L57000;
X	case 21:  goto L58000;
X	case 22:  goto L59000;
X	case 23:  goto L60000;
X    }
X    bug_(70, ri);
X    return ret_val;
X
X/* R38--	MIRROR D ROOM */
X
XL38000:
X    if (prsvec_1.prsa == vindex_1.lookw) {
X	lookto_(rindex_1.fdoor, rindex_1.mrg, 0, 682, 681);
X    }
X    return ret_val;
X
X/* R39--	MIRROR G ROOM */
X
XL39000:
X    if (prsvec_1.prsa == vindex_1.walkiw) {
X	jigsup_(685);
X    }
X    return ret_val;
X
X/* R40--	MIRROR C ROOM */
X
XL40000:
X    if (prsvec_1.prsa == vindex_1.lookw) {
X	lookto_(rindex_1.mrg, rindex_1.mrb, 683, 0, 681);
X    }
X    return ret_val;
X
X/* R41--	MIRROR B ROOM */
X
XL41000:
X    if (prsvec_1.prsa == vindex_1.lookw) {
X	lookto_(rindex_1.mrc, rindex_1.mra, 0, 0, 681);
X    }
X    return ret_val;
X
X/* R42--	MIRROR A ROOM */
X
XL42000:
X    if (prsvec_1.prsa == vindex_1.lookw) {
X	lookto_(rindex_1.mrb, 0, 0, 684, 681);
X    }
X    return ret_val;
X/* RAPPL2, PAGE 3 */
X
X/* R43--	MIRROR C EAST/WEST */
X
XL43000:
X    if (prsvec_1.prsa == vindex_1.lookw) {
X	ewtell_(play_1.here, 683);
X    }
X    return ret_val;
X
X/* R44--	MIRROR B EAST/WEST */
X
XL44000:
X    if (prsvec_1.prsa == vindex_1.lookw) {
X	ewtell_(play_1.here, 686);
X    }
X    return ret_val;
X
X/* R45--	MIRROR A EAST/WEST */
X
XL45000:
X    if (prsvec_1.prsa == vindex_1.lookw) {
X	ewtell_(play_1.here, 687);
X    }
X    return ret_val;
X
X/* R46--	INSIDE MIRROR */
X
XL46000:
X    if (prsvec_1.prsa != vindex_1.lookw) {
X	return ret_val;
X    }
X/* 						!LOOK? */
X    rspeak_(688);
X/* 						!DESCRIBE */
X
X/* NOW DESCRIBE POLE STATE. */
X
X/* CASES 1,2--	MDIR=270 & MLOC=MRB, POLE IS UP OR IN HOLE */
X/* CASES 3,4--	MDIR=0 V MDIR=180, POLE IS UP OR IN CHANNEL */
X/* CASE 5--	POLE IS UP */
X
X    i = 689;
X/* 						!ASSUME CASE 5. */
X    if (findex_1.mdir == 270 && findex_1.mloc == rindex_1.mrb) {
X	i = min(findex_1.poleuf,1) + 690;
X    }
X    if (findex_1.mdir % 180 == 0) {
X	i = min(findex_1.poleuf,1) + 692;
X    }
X    rspeak_(i);
X/* 						!DESCRIBE POLE. */
X    i__1 = findex_1.mdir / 45 + 695;
X    rspsub_(694, i__1);
X/* 						!DESCRIBE ARROW. */
X    return ret_val;
X/* RAPPL2, PAGE 4 */
X
X/* R47--	MIRROR EYE ROOM */
X
XL47000:
X    if (prsvec_1.prsa != vindex_1.lookw) {
X	return ret_val;
X    }
X/* 						!LOOK? */
X    i = 704;
X/* 						!ASSUME BEAM STOP. */
X    i__1 = objcts_1.olnt;
X    for (j = 1; j <= i__1; ++j) {
X	if (qhere_(j, play_1.here) && j != oindex_1.rbeam) {
X	    goto L47200;
X	}
X/* L47100: */
X    }
X    i = 703;
XL47200:
X    rspsub_(i, objcts_1.odesc2[j - 1]);
X/* 						!DESCRIBE BEAM. */
X    lookto_(rindex_1.mra, 0, 0, 0, 0);
X/* 						!LOOK NORTH. */
X    return ret_val;
X
X/* R48--	INSIDE CRYPT */
X
XL48000:
X    if (prsvec_1.prsa != vindex_1.lookw) {
X	return ret_val;
X    }
X/* 						!LOOK? */
X    i = 46;
X/* 						!CRYPT IS OPEN/CLOSED. */
X    if ((objcts_1.oflag2[oindex_1.tomb - 1] & OPENBT) != 0) {
X	i = 12;
X    }
X    rspsub_(705, i);
X    return ret_val;
X
X/* R49--	SOUTH CORRIDOR */
X
XL49000:
X    if (prsvec_1.prsa != vindex_1.lookw) {
X	return ret_val;
X    }
X/* 						!LOOK? */
X    rspeak_(706);
X/* 						!DESCRIBE. */
X    i = 46;
X/* 						!ODOOR IS OPEN/CLOSED. */
X    if ((objcts_1.oflag2[oindex_1.odoor - 1] & OPENBT) != 0) {
X	i = 12;
X    }
X    if (findex_1.lcell == 4) {
X	rspsub_(707, i);
X    }
X/* 						!DESCRIBE ODOOR IF THERE. */
X    return ret_val;
X
X/* R50--	BEHIND DOOR */
X
XL50000:
X    if (prsvec_1.prsa != vindex_1.walkiw) {
X	goto L50100;
X    }
X/* 						!WALK IN? */
X    cevent_1.cflag[cindex_1.cevfol - 1] = TRUE_;
X/* 						!MASTER FOLLOWS. */
X    cevent_1.ctick[cindex_1.cevfol - 1] = -1;
X    return ret_val;
X
XL50100:
X    if (prsvec_1.prsa != vindex_1.lookw) {
X	return ret_val;
X    }
X/* 						!LOOK? */
X    i = 46;
X/* 						!QDOOR IS OPEN/CLOSED. */
X    if ((objcts_1.oflag2[oindex_1.qdoor - 1] & OPENBT) != 0) {
X	i = 12;
X    }
X    rspsub_(708, i);
X    return ret_val;
X/* RAPPL2, PAGE 5 */
X
X/* R51--	FRONT DOOR */
X
XL51000:
X    if (prsvec_1.prsa == vindex_1.walkiw) {
X	cevent_1.ctick[cindex_1.cevfol - 1] = 0;
X    }
X/* 						!IF EXITS, KILL FOLLOW. */
X    if (prsvec_1.prsa != vindex_1.lookw) {
X	return ret_val;
X    }
X/* 						!LOOK? */
X    lookto_(0, rindex_1.mrd, 709, 0, 0);
X/* 						!DESCRIBE SOUTH. */
X    i = 46;
X/* 						!PANEL IS OPEN/CLOSED. */
X    if (findex_1.inqstf) {
X	i = 12;
X    }
X/* 						!OPEN IF INQ STARTED. */
X    j = 46;
X/* 						!QDOOR IS OPEN/CLOSED. */
X    if ((objcts_1.oflag2[oindex_1.qdoor - 1] & OPENBT) != 0) {
X	j = 12;
X    }
X    rspsb2_(710, i, j);
X    return ret_val;
X
X/* R52--	NORTH CORRIDOR */
X
XL52000:
X    if (prsvec_1.prsa != vindex_1.lookw) {
X	return ret_val;
X    }
X/* 						!LOOK? */
X    i = 46;
X    if ((objcts_1.oflag2[oindex_1.cdoor - 1] & OPENBT) != 0) {
X	i = 12;
X    }
X/* 						!CDOOR IS OPEN/CLOSED. */
X    rspsub_(711, i);
X    return ret_val;
X
X/* R53--	PARAPET */
X
XL53000:
X    if (prsvec_1.prsa == vindex_1.lookw) {
X	i__1 = findex_1.pnumb + 712;
X	rspsub_(712, i__1);
X    }
X    return ret_val;
X
X/* R54--	CELL */
X
XL54000:
X    if (prsvec_1.prsa != vindex_1.lookw) {
X	return ret_val;
X    }
X/* 						!LOOK? */
X    i = 721;
X/* 						!CDOOR IS OPEN/CLOSED. */
X    if ((objcts_1.oflag2[oindex_1.cdoor - 1] & OPENBT) != 0) {
X	i = 722;
X    }
X    rspeak_(i);
X    i = 46;
X/* 						!ODOOR IS OPEN/CLOSED. */
X    if ((objcts_1.oflag2[oindex_1.odoor - 1] & OPENBT) != 0) {
X	i = 12;
X    }
X    if (findex_1.lcell == 4) {
X	rspsub_(723, i);
X    }
X/*						!DESCRIBE. */
X    return ret_val;
X
X/* R55--	PRISON CELL */
X
XL55000:
X    if (prsvec_1.prsa == vindex_1.lookw) {
X	rspeak_(724);
X    }
X/* 						!LOOK? */
X    return ret_val;
X
X/* R56--	NIRVANA CELL */
X
XL56000:
X    if (prsvec_1.prsa != vindex_1.lookw) {
X	return ret_val;
X    }
X/* 						!LOOK? */
X    i = 46;
X/* 						!ODOOR IS OPEN/CLOSED. */
X    if ((objcts_1.oflag2[oindex_1.odoor - 1] & OPENBT) != 0) {
X	i = 12;
X    }
X    rspsub_(725, i);
X    return ret_val;
X/* RAPPL2, PAGE 6 */
X
X/* R57--	NIRVANA AND END OF GAME */
X
XL57000:
X    if (prsvec_1.prsa != vindex_1.walkiw) {
X	return ret_val;
X    }
X/* 						!WALKIN? */
X    rspeak_(726);
X    score_(0);
X/* moved to exit routine	CLOSE(DBCH) */
X    exit_();
X
X/* R58--	TOMB ROOM */
X
XL58000:
X    if (prsvec_1.prsa != vindex_1.lookw) {
X	return ret_val;
X    }
X/* 						!LOOK? */
X    i = 46;
X/* 						!TOMB IS OPEN/CLOSED. */
X    if ((objcts_1.oflag2[oindex_1.tomb - 1] & OPENBT) != 0) {
X	i = 12;
X    }
X    rspsub_(792, i);
X    return ret_val;
X
X/* R59--	PUZZLE SIDE ROOM */
X
XL59000:
X    if (prsvec_1.prsa != vindex_1.lookw) {
X	return ret_val;
X    }
X/* 						!LOOK? */
X    i = 861;
X/* 						!ASSUME DOOR CLOSED. */
X    if (findex_1.cpoutf) {
X	i = 862;
X    }
X/* 						!OPEN? */
X    rspeak_(i);
X/* 						!DESCRIBE. */
X    return ret_val;
X
X/* R60--	PUZZLE ROOM */
X
XL60000:
X    if (prsvec_1.prsa != vindex_1.lookw) {
X	return ret_val;
X    }
X/* 						!LOOK? */
X    if (findex_1.cpushf) {
X	goto L60100;
X    }
X/* 						!STARTED PUZZLE? */
X    rspeak_(868);
X/* 						!NO, DESCRIBE. */
X    if ((objcts_1.oflag2[oindex_1.warni - 1] & TCHBT) != 0) {
X	rspeak_(869);
X    }
X    return ret_val;
X
XL60100:
X    cpinfo_(880, findex_1.cphere);
X/* 						!DESCRIBE ROOM. */
X    return ret_val;
X
X} /* rappl2_ */
X
X/* LOOKTO--	DESCRIBE VIEW IN MIRROR HALLWAY */
X
X/* DECLARATIONS */
X
Xstatic void lookto_(nrm, srm, nt, st, ht)
Xinteger nrm;
Xinteger srm;
Xinteger nt;
Xinteger st;
Xinteger ht;
X{
X    /* System generated locals */
X    integer i__1;
X
X    /* Local variables */
X    integer i, m1, dir, mrbf;
X
X    rspeak_(ht);
X/* 						!DESCRIBE HALL. */
X    rspeak_(nt);
X/* 						!DESCRIBE NORTH VIEW. */
X    rspeak_(st);
X/* 						!DESCRIBE SOUTH VIEW. */
X    dir = 0;
X/* 						!ASSUME NO DIRECTION. */
X    if ((i__1 = findex_1.mloc - play_1.here, abs(i__1)) != 1) {
X	goto L200;
X    }
X/* 						!MIRROR TO N OR S? */
X    if (findex_1.mloc == nrm) {
X	dir = 695;
X    }
X    if (findex_1.mloc == srm) {
X	dir = 699;
X    }
X/* 						!DIR=N/S. */
X    if (findex_1.mdir % 180 != 0) {
X	goto L100;
X    }
X/* 						!MIRROR N-S? */
X    rspsub_(847, dir);
X/* 						!YES, HE SEES PANEL */
X    rspsb2_(848, dir, dir);
X/* 						!AND NARROW ROOMS. */
X    goto L200;
X
XL100:
X    m1 = mrhere_(play_1.here);
X/* 						!WHICH MIRROR? */
X    mrbf = 0;
X/* 						!ASSUME INTACT. */
X    if (m1 == 1 && ! findex_1.mr1f || m1 == 2 && ! findex_1.mr2f) {
X	mrbf = 1;
X    }
X    i__1 = mrbf + 849;
X    rspsub_(i__1, dir);
X/* 						!DESCRIBE. */
X    if (m1 == 1 && findex_1.mropnf) {
X	i__1 = mrbf + 823;
X	rspeak_(i__1);
X    }
X    if (mrbf != 0) {
X	rspeak_(851);
X    }
X
XL200:
X    i = 0;
X/* 						!ASSUME NO MORE TO DO. */
X    if (nt == 0 && (dir == 0 || dir == 699)) {
X	i = 852;
X    }
X    if (st == 0 && (dir == 0 || dir == 695)) {
X	i = 853;
X    }
X    if (nt + st + dir == 0) {
X	i = 854;
X    }
X    if (ht != 0) {
X	rspeak_(i);
X    }
X/* 						!DESCRIBE HALLS. */
X} /* lookto_ */
X
X/* EWTELL--	DESCRIBE E/W NARROW ROOMS */
X
X/* DECLARATIONS */
X
Xstatic void ewtell_(rm, st)
Xinteger rm;
Xinteger st;
X{
X    /* System generated locals */
X    integer i__1;
X
X    /* Local variables */
X    integer i;
X    logical m1;
X
X/* NOTE THAT WE ARE EAST OR WEST OF MIRROR, AND */
X/* MIRROR MUST BE N-S. */
X
X    m1 = findex_1.mdir + (rm - rindex_1.mrae) % 2 * 180 == 180;
X    i = (rm - rindex_1.mrae) % 2 + 819;
X/* 						!GET BASIC E/W STRING. */
X    if (m1 && ! findex_1.mr1f || ! m1 && ! findex_1.mr2f) {
X	i += 2;
X    }
X    rspeak_(i);
X    if (m1 && findex_1.mropnf) {
X	i__1 = (i - 819) / 2 + 823;
X	rspeak_(i__1);
X    }
X    rspeak_(825);
X    rspeak_(st);
X} /* ewtell_ */
END_OF_FILE
if test 10376 -ne `wc -c <'nrooms.c'`; then
    echo shar: \"'nrooms.c'\" unpacked with wrong size!
fi
# end of 'nrooms.c'
fi
echo shar: End of archive 10 \(of 12\).
cp /dev/null ark10isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 12 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0