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