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