[comp.sources.games] v02i039: dungeon - game of adventure, Part06/14

games-request@tekred.UUCP (09/01/87)

Submitted by: Bill Randle <games-request@tekred.TEK.COM>
Comp.sources.games: Volume 2, Issue 39
Archive-name: dungeon/Part06

	[Due to a messup on my part, the first five parts of the
	 distribution will say "Part n of 7" when unshared.  They are
	 really "Part n of 14".  Sorry for the inconvenience. -br]

#! /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 6 (of 14)."
# Contents:  History actors.F dgame.F dmain.F dverb1.F np.F np2.F
#   nrooms.F oflags.h speak.F
# Wrapped by billr@tekred on Tue Apr 21 10:24:34 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f History -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"History\"
else
echo shar: Extracting \"History\" \(4401 characters\)
sed "s/^X//" >History <<'END_OF_History'
X	History of the Unix f77 Implementation of Dungeon
X	=================================================
X
XThis version of dungeon has been modified from the original source
Xso that it will compile and execute on Unix[TM] Systems using the
Xf77 FORTRAN Compiler.  The original was written in DEC FORTRAN,
Xtranslated from MDL.  See the file "dungeon.doc" for the complete
Xoriginal documentation.  See the file "PDP.doc" for notes on the
XUnix/pdp implementation.
X
XI. From the original documentation...
X
XTo:	Dungeon Players
XFrom:	"The Translator"
XSubj:	Game Information
XDate:	8-OCT-80
X
X
XThis is the first (and last) source release of the PDP-11 version of 
XDungeon.
X
XPlease note that Dungeon has been superceded by the game ZORK(tm).
XThe following is an extract from the new product announcement for
XZORK in the September, 1980 issue of the RT-11 SIG newsletter:
X
X  "'ZORK:  The Great Underground Empire - Part I' ...was developed
X   by the original authors based on their ZORK (Dungeon) game for
X   the PDP-10.  It features a greatly improved parser;  command
X   input and transcript output files;  SAVEs to any device and
X   file name;  and adaptation to different terminal types,
X   including a status line on VT100s.  Note:  this is not the
X   FORTRAN version that has been available through DECUS.  This
X   version has been completely rewritten to run efficiently on
X   small machines - up to 10 times as fast as the DECUS version.
X
X   ...ZORK runs under RT-ll, HT-ll, or RSTS/E and requires as
X   little as 20K words of memory and a single floppy disk drive.
X   The game package, consisting of an RX01-format diskette and
X   an instruction booklet, is available from Infocom, Inc.,
X   P.O. Box 120, Kendall Station, Cambridge, Ma. 02142."
X
XZORK(tm) is a trademark of Infocom, Inc.  It is available for several
Xpopular personal computers as well as for the PDP-ll.
X
X
XSUMMARY
X-------
X
X		    Welcome to Dungeon!
X
X   Dungeon is a game of adventure, danger, and low cunning.  In it
Xyou will explore some of the most amazing territory ever seen by mortal
Xman.  Hardened adventurers have run screaming from the terrors contained
Xwithin.
X
X   In Dungeon, the intrepid explorer delves into the forgotten secrets
Xof a lost labyrinth deep in the bowels of the earth, searching for
Xvast treasures long hidden from prying eyes, treasures guarded by
Xfearsome monsters and diabolical traps!
X
X   No DECsystem should be without one!
X
X   Dungeon was created at the Programming Technology Division of the MIT
XLaboratory for Computer Science by Tim Anderson, Marc Blank, Bruce
XDaniels, and Dave Lebling.  It was inspired by the Adventure game of
XCrowther and Woods, and the Dungeons and Dragons game of Gygax
Xand Arneson.  The original version was written in MDL (alias MUDDLE).
XThe current version was translated from MDL into FORTRAN IV by
Xa somewhat paranoid DEC engineer who prefers to remain anonymous.
X
X   On-line information may be obtained with the commands HELP and INFO.
X
XII. DEC FORTRAN to f77 Conversion (17-nov-81)
X
XThe conversion from DEC FORTRAN to Unix f77 was done by Randy Dietrich,
XLynn Cochran and Sig Peterson.  Much hacking was done to get it to fit
Xin the limited address space of a PDP-11/44 (split I/D).  See the
Xfile "PDP.doc" for all the gory details.  Suffice it to say that by
Xleaving out the debugging package and not linking in the f77 i/o
Xlibrary they managed to get it to run.
X
XIII. PDP to VAX (dec-85)
X
XBased on the work of Randy, Lynn and Sig, Bill Randle folded in the
Xfull save/restore functions and the game debugging package (gdt) into
Xthe pdp version to create a Vax/Unix version.  This version also uses
Xf77 i/o, thus eliminating the extra speak and listen processes needed
Xon the pdp.
X
XIV. Cleanup I (11-dec-86)
X
XJohn Gilmore (hoptoad!gnu) cleaned up the source files by moving
Xmost of the common declarations into include files and added
Xcomments from the original (FORTRAN or MDL?) source.  His efforts
Xare greatly appreciated.
X
XV. Cleanup II (9-feb-87)
X
XBill Randle (billr@tekred.tek.com) added the pdp dependencies back
Xinto the Vax source files with #ifdefs in order to have just one
Xset of sources.  Previously, there were two sets of source: one for
Xthe pdp and one for the Vax.  In addition, a shell escape of the
Xform !cmd was added and the wizard can enter the gdt without having
Xto recompile the source.  Finally, a man page was generated, based
Xon the dungeon.doc file.
END_OF_History
if test 4401 -ne `wc -c <History`; then
    echo shar: \"History\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f actors.F -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"actors.F\"
else
echo shar: Extracting \"actors.F\" \(6949 characters\)
sed "s/^X//" >actors.F <<'END_OF_actors.F'
XC AAPPLI- APPLICABLES FOR ADVENTURERS
XC
XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
XC WRITTEN BY R. M. SUPNIK
XC
XC DECLARATIONS
XC
X	LOGICAL FUNCTION AAPPLI(RI)
X	IMPLICIT INTEGER (A-Z)
X	LOGICAL F,MOVETO
X#include "parser.h"
X#include "gamestate.h"
X#include "rooms.h"
X#include "rflag.h"
X#include "rindex.h"
X#include "xsrch.h"
X#include "objects.h"
X#include "oflags.h"
X#include "oindex.h"
X#include "clock.h"
X#include "advers.h"
X#include "verbs.h"
X#include "flags.h"
XC AAPPLI, PAGE 2
XC
X	IF(RI.EQ.0) GO TO 10
XC						!IF ZERO, NO APP.
X	AAPPLI=.TRUE.
XC						!ASSUME WINS.
X	GO TO (1000,2000),RI
XC						!BRANCH ON ADV.
X	CALL BUG(11,RI)
XC
XC COMMON FALSE RETURN.
XC
X10	AAPPLI=.FALSE.
X	RETURN
XC
XC A1--	ROBOT.  PROCESS MOST COMMANDS GIVEN TO ROBOT.
XC
X1000	IF((PRSA.NE.RAISEW).OR.(PRSO.NE.RCAGE)) GO TO 1200
X	CFLAG(CEVSPH)=.FALSE.
XC						!ROBOT RAISED CAGE.
X	WINNER=PLAYER
XC						!RESET FOR PLAYER.
X	F=MOVETO(CAGER,WINNER)
XC						!MOVE TO NEW ROOM.
X	CALL NEWSTA(CAGE,567,CAGER,0,0)
XC						!INSTALL CAGE IN ROOM.
X	CALL NEWSTA(ROBOT,0,CAGER,0,0)
XC						!INSTALL ROBOT IN ROOM.
X	AROOM(AROBOT)=CAGER
XC						!ALSO MOVE ROBOT/ADV.
X	CAGESF=.TRUE.
XC						!CAGE SOLVED.
X	OFLAG1(ROBOT)=and(OFLAG1(ROBOT),not(NDSCBT))
X	OFLAG1(SPHER)=or(OFLAG1(SPHER),TAKEBT)
X	RETURN
XC
X1200	IF((PRSA.NE.DRINKW).AND.(PRSA.NE.EATW)) GO TO 1300
X	CALL RSPEAK(568)
XC						!EAT OR DRINK, JOKE.
X	RETURN
XC
X1300	IF(PRSA.NE.READW) GO TO 1400
XC						!READ,
X	CALL RSPEAK(569)
XC						!JOKE.
X	RETURN
XC
X1400	IF((PRSA.EQ.WALKW).OR.(PRSA.EQ.TAKEW).OR.(PRSA.EQ.DROPW)
X&	 .OR.(PRSA.EQ.PUTW).OR.(PRSA.EQ.PUSHW).OR.(PRSA.EQ.THROWW)
X&	 .OR.(PRSA.EQ.TURNW).OR.(PRSA.EQ.LEAPW)) GO TO 10
X	CALL RSPEAK(570)
XC						!JOKE.
X	RETURN
XC AAPPLI, PAGE 3
XC
XC A2--	MASTER.  PROCESS MOST COMMANDS GIVEN TO MASTER.
XC
X2000	IF(and(OFLAG2(QDOOR),OPENBT).NE.0) GO TO 2100
X	CALL RSPEAK(783)
XC						!NO MASTER YET.
X	RETURN
XC
X2100	IF(PRSA.NE.WALKW) GO TO 2200
XC						!WALK?
X	I=784
XC						!ASSUME WONT.
X	IF(((HERE.EQ.SCORR).AND.
X&		((PRSO.EQ.XNORTH).OR.(PRSO.EQ.XENTER))).OR.
X&	  ((HERE.EQ.NCORR).AND.
X&		((PRSO.EQ.XSOUTH).OR.(PRSO.EQ.XENTER))))
X&		I=785
X	CALL RSPEAK(I)
X	RETURN
XC
X2200	IF((PRSA.EQ.TAKEW).OR.(PRSA.EQ.DROPW).OR.(PRSA.EQ.PUTW).OR.
X&	  (PRSA.EQ.THROWW).OR.(PRSA.EQ.PUSHW).OR.(PRSA.EQ.TURNW).OR.
X&	  (PRSA.EQ.SPINW).OR.(PRSA.EQ.TRNTOW).OR.(PRSA.EQ.FOLLOW).OR.
X&	  (PRSA.EQ.STAYW).OR.(PRSA.EQ.OPENW).OR.(PRSA.EQ.CLOSEW).OR.
X&	  (PRSA.EQ.KILLW)) GO TO 10
X	CALL RSPEAK(786)
XC						!MASTER CANT DO IT.
X	RETURN
XC
X	END
XC THIEFD-	INTERMOVE THIEF DEMON
XC
XC DECLARATIONS
XC
X	SUBROUTINE THIEFD
X	IMPLICIT INTEGER (A-Z)
X	LOGICAL ONCE,PROB,QHERE,QSTILL,LIT,WINNIN
X#include "gamestate.h"
XC
X#include "debug.h"
X#include "rooms.h"
X#include "rflag.h"
X#include "rindex.h"
X#include "objects.h"
X#include "oflags.h"
X#include "oindex.h"
X#include "villians.h"
X#include "flags.h"
XC
XC FUNCTIONS AND DATA
XC
X	QSTILL(R)=(QHERE(STILL,R).OR.(OADV(STILL).EQ.-THIEF))
XC THIEFD, PAGE 2
XC
X#ifdef debug
X	DFLAG=and(PRSFLG, 32768).NE.0
X#endif debug
XC						!SET UP DETAIL FLAG.
X	ONCE=.FALSE.
XC						!INIT FLAG.
X1025	RHERE=OROOM(THIEF)
XC						!VISIBLE POS.
X	IF(RHERE.NE.0) THFPOS=RHERE
XC
X	IF(THFPOS.EQ.HERE) GO TO 1100
XC						!THIEF IN WIN RM?
X	IF(THFPOS.NE.TREAS) GO TO 1400
XC						!THIEF NOT IN TREAS?
XC
XC THIEF IS IN TREASURE ROOM, AND WINNER IS NOT.
XC
X#ifdef debug
X	IF(DFLAG) PRINT 10
X10	FORMAT(' THIEFD-- IN TREASURE ROOM')
X#endif debug
X	IF(RHERE.EQ.0) GO TO 1050
XC						!VISIBLE?
X	CALL NEWSTA(THIEF,0,0,0,0)
XC						!YES, VANISH.
X	RHERE=0
X	IF(QSTILL(TREAS)) CALL NEWSTA(STILL,0,0,THIEF,0)
X1050	I=ROBADV(-THIEF,THFPOS,0,0)
XC						!DROP VALUABLES.
X	IF(QHERE(EGG,THFPOS)) OFLAG2(EGG)=or(OFLAG2(EGG),OPENBT)
X	GO TO 1700
XC
XC THIEF AND WINNER IN SAME ROOM.
XC
X1100	IF(THFPOS.EQ.TREAS) GO TO 1700
XC						!IF TREAS ROOM, NOTHING.
X	IF(and(RFLAG(THFPOS),RLIGHT).NE.0) GO TO 1400
X#ifdef debug
X	IF(DFLAG) PRINT 20
X20	FORMAT(' THIEFD-- IN ADV ROOM')
X#endif debug
X	IF(THFFLG) GO TO 1300
XC						!THIEF ANNOUNCED?
X	IF((RHERE.NE.0).OR.PROB(70,70)) GO TO 1150
XC						!IF INVIS AND 30%.
X	IF(OCAN(STILL).NE.THIEF) GO TO 1700
XC						!ABORT IF NO STILLETTO.
X	CALL NEWSTA(THIEF,583,THFPOS,0,0)
XC						!INSERT THIEF INTO ROOM.
X	THFFLG=.TRUE.
XC						!THIEF IS ANNOUNCED.
X	RETURN
XC
X1150	IF((RHERE.EQ.0).OR.(and(OFLAG2(THIEF),FITEBT).EQ.0))
X&		GO TO 1200
X	IF(WINNIN(THIEF,WINNER)) GO TO 1175
XC						!WINNING?
X	CALL NEWSTA(THIEF,584,0,0,0)
XC						!NO, VANISH THIEF.
X	OFLAG2(THIEF)=and(OFLAG2(THIEF), not(FITEBT))
X	IF(QSTILL(THFPOS)) CALL NEWSTA(STILL,0,0,THIEF,0)
X	RETURN
XC
X1175	IF(PROB(90,90)) GO TO 1700
XC						!90% CHANCE TO STAY.
XC
X1200	IF((RHERE.EQ.0).OR.PROB(70,70)) GO TO 1250
XC						!IF VISIBLE AND 30%
X	CALL NEWSTA(THIEF,585,0,0,0)
XC						!VANISH THIEF.
X	IF(QSTILL(THFPOS)) CALL NEWSTA(STILL,0,0,THIEF,0)
X	RETURN
XC
X1300	IF(RHERE.EQ.0) GO TO 1700
XC						!ANNOUNCED.  VISIBLE?
X1250	IF(PROB(70,70)) RETURN
XC						!70% CHANCE TO DO NOTHING.
X	THFFLG=.TRUE.
X	NR=ROBRM(THFPOS,100,0,0,-THIEF)+ROBADV(WINNER,0,0,-THIEF)
X	I=586
XC						!ROBBED EM.
X	IF(RHERE.NE.0) I=588
XC						!WAS HE VISIBLE?
X	IF(NR.NE.0) I=I+1
XC						!DID HE GET ANYTHING?
X	CALL NEWSTA(THIEF,I,0,0,0)
XC						!VANISH THIEF.
X	IF(QSTILL(THFPOS))
X&		CALL NEWSTA(STILL,0,0,THIEF,0)
X	IF((NR.NE.0).AND..NOT.LIT(THFPOS)) CALL RSPEAK(406)
X	RHERE=0
X	GO TO 1700
XC						!ONWARD.
XC
XC NOT IN ADVENTURERS ROOM.
XC
X1400	CALL NEWSTA(THIEF,0,0,0,0)
XC						!VANISH.
X	RHERE=0
X#ifdef debug
X	IF(DFLAG) PRINT 30,THFPOS
X30	FORMAT(' THIEFD-- IN ROOM ',I4)
X#endif debug
X	IF(QSTILL(THFPOS))
X&		CALL NEWSTA(STILL,0,0,THIEF,0)
X	IF(and(RFLAG(THFPOS),RSEEN).EQ.0) GO TO 1700
X	I=ROBRM(THFPOS,75,0,0,-THIEF)
XC						!ROB ROOM 75%.
X	IF((THFPOS.LT.MAZE1).OR.(THFPOS.GT.MAZ15).OR.
X&		(HERE.LT.MAZE1).OR.(HERE.GT.MAZ15)) GO TO 1500
X	DO 1450 I=1,OLNT
XC						!BOTH IN MAZE.
X	  IF(.NOT.QHERE(I,THFPOS).OR.PROB(60,60).OR.
X&		(and(OFLAG1(I),(VISIBT+TAKEBT)).NE.(VISIBT+TAKEBT)))
X&		GO TO 1450
X	  CALL RSPSUB(590,ODESC2(I))
XC						!TAKE OBJECT.
X	  IF(PROB(40,20)) GO TO 1700
X	  CALL NEWSTA(I,0,0,0,-THIEF)
XC						!MOST OF THE TIME.
X	  OFLAG2(I)=or(OFLAG2(I),TCHBT)
X	  GO TO 1700
X1450	CONTINUE
X	GO TO 1700
XC
X1500	DO 1550 I=1,OLNT
XC						!NOT IN MAZE.
X	  IF(.NOT.QHERE(I,THFPOS).OR.(OTVAL(I).NE.0).OR.PROB(80,60).OR.
X&		(and(OFLAG1(I),(VISIBT+TAKEBT)).NE.(VISIBT+TAKEBT)))
X&		GO TO 1550
X	  CALL NEWSTA(I,0,0,0,-THIEF)
X	  OFLAG2(I)=or(OFLAG2(I),TCHBT)
X	  GO TO 1700
X1550	CONTINUE
XC
XC NOW MOVE TO NEW ROOM.
XC
X1700	IF(OADV(ROPE).EQ.-THIEF) DOMEF=.FALSE.
X	IF(ONCE) GO TO 1800
X	ONCE=.NOT.ONCE
X1750	THFPOS=THFPOS-1
XC						!NEXT ROOM.
X	IF(THFPOS.LE.0) THFPOS=RLNT
X	IF(and(RFLAG(THFPOS),(RLAND+RSACRD+REND)).NE.RLAND)
X&		GO TO 1750
X	THFFLG=.FALSE.
XC						!NOT ANNOUNCED.
X	GO TO 1025
XC						!ONCE MORE.
XC
XC ALL DONE.
XC
X1800	IF(THFPOS.EQ.TREAS) RETURN
XC						!IN TREASURE ROOM?
X	J=591
XC						!NO, DROP STUFF.
X	IF(THFPOS.NE.HERE) J=0
X	DO 1850 I=1,OLNT
X	  IF((OADV(I).NE.-THIEF).OR.PROB(70,70).OR.
X&		(OTVAL(I).GT.0)) GO TO 1850
X	  CALL NEWSTA(I,J,THFPOS,0,0)
X	  J=0
X1850	CONTINUE
X	RETURN
XC
X	END
END_OF_actors.F
if test 6949 -ne `wc -c <actors.F`; then
    echo shar: \"actors.F\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f dgame.F -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"dgame.F\"
else
echo shar: Extracting \"dgame.F\" \(4492 characters\)
sed "s/^X//" >dgame.F <<'END_OF_dgame.F'
XC GAME- MAIN COMMAND LOOP FOR DUNGEON
XC
XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
XC WRITTEN BY R. M. SUPNIK
XC
XC DECLARATIONS
XC
X	SUBROUTINE GAME
X	IMPLICIT INTEGER (A-Z)
X	LOGICAL RMDESC,VAPPLI,RAPPLI,AAPPLI
X	LOGICAL F,PARSE,FINDXT,XVEHIC,LIT
X	CHARACTER SECHO(4)
X	CHARACTER GDTSTR(3)
X#include "parser.h"
X#include "gamestate.h"
X#include "state.h"
X#include "io.h"
X#include "rooms.h"
X#include "rindex.h"
X#include "objects.h"
X#include "oflags.h"
X#include "oindex.h"
X#include "advers.h"
X#include "verbs.h"
X#include "flags.h"
XC
XC FUNCTIONS AND DATA
XC
X	DATA SECHO/'E','C','H','O'/
X	DATA GDTSTR/'G','D','T'/
XC GAME, PAGE 2
XC
XC START UP, DESCRIBE CURRENT LOCATION.
XC
X	CALL RSPEAK(1)
XC						!WELCOME ABOARD.
X	F=RMDESC(3)
XC						!START GAME.
XC
XC NOW LOOP, READING AND EXECUTING COMMANDS.
XC
X100	WINNER=PLAYER
XC						!PLAYER MOVING.
X	TELFLG=.FALSE.
XC						!ASSUME NOTHING TOLD.
X	IF(PRSCON.LE.1) CALL RDLINE(INBUF,INLNT,1)
XC
X	DO 150 I=1,3
XC						!CALL ON GDT?
X	  IF(INBUF(I+PRSCON-1).NE.GDTSTR(I)) GO TO 200
X150	CONTINUE
X	CALL GDT
XC						!YES, INVOKE.
X	GO TO 100
XC						!ONWARD.
XC
X200	MOVES=MOVES+1
X	PRSWON=PARSE(INBUF,INLNT,.TRUE.)
X	IF(.NOT.PRSWON) GO TO 400
XC						!PARSE LOSES?
X	IF(XVEHIC(1)) GO TO 400
XC						!VEHICLE HANDLE?
XC
X	IF(PRSA.EQ.TELLW) GO TO 2000
XC						!TELL?
X300	IF((PRSO.EQ.VALUA).OR.(PRSO.EQ.EVERY)) GO TO 900
X	IF(.NOT.VAPPLI(PRSA)) GO TO 400
XC						!VERB OK?
X350	IF(.NOT.ECHOF.AND.(HERE.EQ.ECHOR)) GO TO 1000
X	F=RAPPLI(RACTIO(HERE))
XC
X400	CALL XENDMV(TELFLG)
XC						!DO END OF MOVE.
X	IF(.NOT.LIT(HERE)) PRSCON=1
X	GO TO 100
XC
X900	CALL VALUAC(VALUA)
X	GO TO 350
XC GAME, PAGE 3
XC
XC SPECIAL CASE-- ECHO ROOM.
XC IF INPUT IS NOT 'ECHO' OR A DIRECTION, JUST ECHO.
XC
X1000	CALL RDLINE(INBUF,INLNT,0)
X	MOVES=MOVES+1
XC						!CHARGE FOR MOVES.
X	DO 1100 I=1,4
XC						!INPUT = ECHO?
X	  IF(INBUF(I).NE.SECHO(I)) GO TO 1300
X1100	CONTINUE
XC
XC   Note: the following DO loop was changed from DO 1200 I=5,78
XC     The change was necessary because the RDLINE function was changed,
XC      and no longer provides a 78 character buffer padded with blanks.
XC
X	DO 1200 I=5,INLNT
X	  IF(INBUF(I).NE.' ') GO TO 1300
X1200	CONTINUE
XC
X	CALL RSPEAK(571)
XC						!KILL THE ECHO.
X	ECHOF=.TRUE.
X	OFLAG2(BAR)=and(OFLAG2(BAR), not(SCRDBT))
X	PRSWON=.TRUE.
XC						!FAKE OUT PARSER.
X	PRSCON=1
XC						!FORCE NEW INPUT.
X	GO TO 400
XC
X1300	PRSWON=PARSE(INBUF,INLNT,.FALSE.)
X	IF(.NOT.PRSWON .OR. (PRSA.NE.WALKW))
X&		GO TO 1400
X	IF(FINDXT(PRSO,HERE)) GO TO 300
XC						!VALID EXIT?
XC
X#ifdef PDP
X1400	call outstr(INLINE, INLNT)
X#else
X1400	WRITE(OUTCH,1410) (INBUF(J),J=1,INLNT)
X1410	FORMAT(1X,78A1)
X#endif PDP
X	TELFLG=.TRUE.
XC						!INDICATE OUTPUT.
X	GO TO 1000
XC						!MORE ECHO ROOM.
XC GAME, PAGE 4
XC
XC SPECIAL CASE-- TELL <ACTOR>, NEW COMMAND
XC NOTE THAT WE CANNOT BE IN THE ECHO ROOM.
XC
X2000	IF(and(OFLAG2(PRSO),ACTRBT).NE.0) GO TO 2100
X	CALL RSPEAK(602)
XC						!CANT DO IT.
X	GO TO 350
XC						!VAPPLI SUCCEEDS.
XC
X2100	WINNER=OACTOR(PRSO)
XC						!NEW PLAYER.
X	HERE=AROOM(WINNER)
XC						!NEW LOCATION.
X	IF(PRSCON.LE.1) GO TO 2700
XC						!ANY INPUT?
X	IF(PARSE(INBUF,INLNT,.TRUE.)) GO TO 2150
X2700	I=341
XC						!FAILS.
X	IF(TELFLG) I=604
XC						!GIVE RESPONSE.
X	CALL RSPEAK(I)
X2600	WINNER=PLAYER
XC						!RESTORE STATE.
X	HERE=AROOM(WINNER)
X	GO TO 350
XC
X2150	IF(AAPPLI(AACTIO(WINNER))) GO TO 2400
XC						!ACTOR HANDLE?
X	IF(XVEHIC(1)) GO TO 2400
XC						!VEHICLE HANDLE?
X	IF((PRSO.EQ.VALUA).OR.(PRSO.EQ.EVERY)) GO TO 2900
X	IF(.NOT.VAPPLI(PRSA)) GO TO 2400
XC						!VERB HANDLE?
X2350	F=RAPPLI(RACTIO(HERE))
XC
X2400	CALL XENDMV(TELFLG)
XC						!DO END OF MOVE.
X	GO TO 2600
XC						!DONE.
XC
X2900	CALL VALUAC(VALUA)
XC						!ALL OR VALUABLES.
X	GO TO 350
XC
X	END
XC XENDMV-	EXECUTE END OF MOVE FUNCTIONS.
XC
XC DECLARATIONS
XC
X	SUBROUTINE XENDMV(FLAG)
X	IMPLICIT INTEGER(A-Z)
X	LOGICAL F,CLOCKD,FLAG,XVEHIC
X#include "parser.h"
X#include "villians.h"
XC
X	IF(.NOT.FLAG) CALL RSPEAK(341)
XC						!DEFAULT REMARK.
X	IF(THFACT) CALL THIEFD
XC						!THIEF DEMON.
X	IF(PRSWON) CALL FIGHTD
XC						!FIGHT DEMON.
X	IF(SWDACT) CALL SWORDD
XC						!SWORD DEMON.
X	IF(PRSWON) F=CLOCKD(X)
XC						!CLOCK DEMON.
X	IF(PRSWON) F=XVEHIC(2)
XC						!VEHICLE READOUT.
X	RETURN
X	END
XC XVEHIC- EXECUTE VEHICLE FUNCTION
XC
XC DECLARATIONS
XC
X	LOGICAL FUNCTION XVEHIC(N)
X	IMPLICIT INTEGER(A-Z)
X	LOGICAL OAPPLI
X#include "gamestate.h"
X#include "objects.h"
X#include "advers.h"
XC
X	XVEHIC=.FALSE.
XC						!ASSUME LOSES.
X	AV=AVEHIC(WINNER)
XC						!GET VEHICLE.
X	IF(AV.NE.0) XVEHIC=OAPPLI(OACTIO(AV),N)
X	RETURN
X	END
END_OF_dgame.F
if test 4492 -ne `wc -c <dgame.F`; then
    echo shar: \"dgame.F\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f dmain.F -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"dmain.F\"
else
echo shar: Extracting \"dmain.F\" \(6633 characters\)
sed "s/^X//" >dmain.F <<'END_OF_dmain.F'
XC DUNGEON-- MAIN PROGRAM
XC
XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
XC WRITTEN BY R. M. SUPNIK
XC
X	PROGRAM DUNGEO
XC
XC DECLARATIONS
XC
X	IMPLICIT INTEGER (A-Z)
X	LOGICAL INIT
X#include "parser.h"
X#include "gamestate.h"
X#include "state.h"
X#include "screen.h"
X#include "puzzle.h"
XC
XC MISCELLANEOUS VARIABLES
XC
X	CHARACTER VEDIT
X	COMMON /STAR/ MBASE,STRBIT
X	COMMON /VERS/ VMAJ,VMIN,VEDIT
X	COMMON /BATS/ BATDRP(9)
X#include "io.h"
X#include "debug.h"
X	COMMON /HYPER/ HFACTR
X#include "rooms.h"
X#include "rflag.h"
X#include "rindex.h"
X#include "exits.h"
X#include "curxt.h"
X#include "xpars.h"
X#include "xsrch.h"
X#include "objects.h"
X#include "oflags.h"
X#include "oindex.h"
X#include "clock.h"
X
X#include "villians.h"
X#include "advers.h"
X#include "verbs.h"
X#include "flags.h"
XC DUNGEON, PAGE 2
XC
XC DATA STATEMENTS FOR CONSTANT ARRAYS
XC
X	DATA VMAJ/2/,VMIN/6/,VEDIT/'A'/
XC
X	DATA SDIR/o'40000'/,SIND/o'20000'/,SSTD/o'10000'/,
X&		SFLIP/o'4000'/,SDRIV/o'2000'/,SVMASK/o'777'/
X	DATA VABIT/o'40000'/,VRBIT/o'20000'/,VTBIT/o'10000'/,
X&		VCBIT/o'4000'/,VEBIT/o'2000'/,VFBIT/o'1000'/,
X&		VPMASK/o'777'/
XC
X	DATA BATDRP/66,67,68,69,70,71,72,65,73/
XC
X	DATA SCOLDR/o'2000',153,o'12000',154,o'6000',152,o'16000',151/
X	DATA SCOLWL/151,207,o'6000',152,208,o'16000',
X&		153,206,o'12000',154,205,o'2000'/
XC
X	DATA HFACTR/500/
XC
X	DATA CPDR/o'2000',-8,o'4000',-7,o'6000',1,o'10000',9,
X&		o'12000',8,o'14000',7,o'16000',-1,o'20000',-9/
X	DATA CPWL/205,-8,206,8,207,1,208,-1/
X	DATA CPVEC/1,1,1,1,1,1,1,1,
X&		1,0,-1,0,0,-1,0,1,
X&		1,-1,0,1,0,-2,0,1,
X&		1,0,0,0,0,1,0,1,
X&		1,-3,0,0,-1,-1,0,1,
X&		1,0,0,-1,0,0,0,1,
X&		1,1,1,0,0,0,1,1,
X&		1,1,1,1,1,1,1,1/
XC
X	DATA CEVCUR/1/,CEVMNT/2/,CEVLNT/3/,CEVMAT/4/,
X&		CEVCND/5/,CEVBAL/6/,CEVBRN/7/,CEVFUS/8/,
X&		CEVLED/9/,CEVSAF/10/,CEVVLG/11/,CEVGNO/12/,
X&		CEVBUC/13/,CEVSPH/14/,CEVEGH/15/,
X&		CEVFOR/16/,CEVSCL/17/,CEVZGI/18/,CEVZGO/19/,
X&		CEVSTE/20/,CEVMRS/21/,CEVPIN/22/,CEVINQ/23/,
X&		CEVFOL/24/
XC
X	DATA XRMASK/o'377'/,XDMASK/o'76000'/,XFMASK/3/
X	DATA XFSHFT/256/,XASHFT/256/
X	DATA XNORM/1/,XNO/2/,XCOND/3/,XDOOR/4/
X	DATA XELNT/1,2,3,3/,XLFLAG/o'100000'/
X	DATA XMIN/o'2000'/,XMAX/o'40000'/,XUP/o'22000'/,XDOWN/o'24000'/
X	DATA XNORTH/o'2000'/,XSOUTH/o'12000'/,XENTER/o'32000'/,
X&		   	XEXIT/o'34000'/
X	DATA XEAST/o'6000'/,XWEST/o'16000'/
XC
X	DATA PLAYER/1/,AROBOT/2/,AMASTR/3/
X	DATA ASTAG/o'100000'/
XC
X	DATA RSEEN/o'100000'/,RLIGHT/o'40000'/,RLAND/o'20000'/
X	DATA RWATER/o'10000'/,RAIR/o'4000'/,RSACRD/o'2000'/,
X&		RFILL/o'1000'/
X	DATA RMUNG/o'400'/,RBUCK/o'200'/,RHOUSE/o'100'/,
X&		RNWALL/o'40'/,REND/o'20'/
XC
X	DATA WHOUS/2/,LROOM/8/,CELLA/9/
X	DATA MTROL/10/,MAZE1/11/
X	DATA MGRAT/25/,MAZ15/30/
X	DATA FORE1/31/,FORE3/33/,CLEAR/36/,RESER/40/
X	DATA STREA/42/,EGYPT/44/,ECHOR/49/
X	DATA TSHAF/61/
X	DATA BSHAF/76/,MMACH/77/,DOME/79/,MTORC/80/
X	DATA CAROU/83/
X	DATA RIDDL/91/,LLD2/94/,TEMP1/96/,TEMP2/97/,MAINT/100/
X	DATA MCYCL/101/,BLROO/102/,TREAS/103/,RIVR1/107/,RIVR2/108/
X	DATA 	RIVR3/109/
X	DATA RIVR4/112/,RIVR5/113/,FCHMP/114/,MBARR/119/,FALLS/120/
X	DATA MRAIN/121/,POG/122/,VLBOT/126/,VAIR1/127/,VAIR2/128/
X	DATA 	VAIR3/129/,VAIR4/130/
X	DATA LEDG2/131/,LEDG3/132/,LEDG4/133/,MSAFE/135/,CAGER/140/
X	DATA CAGED/141/,TWELL/142/,BWELL/143/,ALICE/144/,ALISM/145/
X	DATA 	ALITR/146/,MTREE/147/,BKENT/148/
X	DATA BKVW/151/,BKTWI/153/,BKVAU/154/,BKBOX/155/
X	DATA	CRYPT/157/,TSTRS/158/,MRANT/159/
X	DATA MREYE/160/,MRA/161/,MRB/162/,MRC/163/,MRG/164/
X	DATA	MRD/165/,FDOOR/166/,MRAE/167/
X	DATA MRCE/171/,MRCW/172/,MRGE/173/,MRGW/174/,MRDW/176/
X	DATA	INMIR/177/,SCORR/179/
X	DATA NCORR/182/,PARAP/183/,CELL/184/,PCELL/185/,NCELL/186/
X	DATA	CPANT/188/,CPOUT/189/
X	DATA CPUZZ/190/
XC
X	DATA CINTW/1/,DEADXW/2/,FRSTQW/3/,INXW/4/
X	DATA OUTXW/5/,WALKIW/6/,FIGHTW/7/,FOOW/8/
XC
X	DATA READW/100/,MELTW/101/
X	DATA INFLAW/102/,DEFLAW/103/,ALARMW/104/,EXORCW/105/
X	DATA PLUGW/106/,KICKW/107/,WAVEW/108/,RAISEW/109/,LOWERW/110/
X	DATA RUBW/111/,PUSHW/112/,UNTIEW/113/,TIEW/114/,TIEUPW/115/
X	DATA TURNW/116/,BREATW/117/,KNOCKW/118/,LOOKW/119/
X	DATA EXAMIW/120/,SHAKEW/121/,MOVEW/122/,TRNONW/123/,TRNOFW/124/
X	DATA OPENW/125/,CLOSEW/126/,FINDW/127/,WAITW/128/,SPINW/129/
X	DATA BOARDW/130/,UNBOAW/131/,TAKEW/132/,INVENW/133/
X	DATA FILLW/134/,EATW/135/,DRINKW/136/,BURNW/137/
X	DATA MUNGW/138/,KILLW/139/,ATTACW/141/
X	DATA SWINGW/140/,WALKW/142/,TELLW/143/,PUTW/144/
X	DATA DROPW/145/,GIVEW/146/,POURW/147/,THROWW/148/
XC
X	DATA DIGW/89/,LEAPW/91/,STAYW/73/,FOLLOW/85/
X	DATA HELLOW/151/,LOOKIW/152/,LOOKUW/153/,PUMPW/154/
X	DATA WINDW/155/,CLMBW/156/,CLMBUW/157/,CLMBDW/158/,TRNTOW/159/
XC
X	DATA VISIBT/o'100000'/,READBT/o'40000'/,TAKEBT/o'20000'/,
X&		DOORBT/o'10000'/,TRANBT/o'4000'/,FOODBT/o'2000'/,
X&		NDSCBT/o'1000'/,DRNKBT/o'400'/, CONTBT/o'200'/,
X&		LITEBT/o'100'/,VICTBT/o'40'/,BURNBT/o'20'/,
X&		FLAMBT/o'10'/,TOOLBT/o'4'/,TURNBT/o'2'/,ONBT/o'1'/
XC
X	DATA FINDBT/o'100000'/,SLEPBT/o'40000'/,SCRDBT/o'20000'/,
X&		TIEBT/o'10000'/, CLMBBT/o'4000'/,ACTRBT/o'2000'/,
X&		WEAPBT/o'1000'/,FITEBT/o'400'/, VILLBT/o'200'/,
X&		STAGBT/o'100'/,TRYBT/o'40'/,NOCHBT/o'20'/,
X&		OPENBT/o'10'/,TCHBT/o'4'/,VEHBT/o'2'/,SCHBT/o'1'/
XC
X	DATA GARLI/2/,FOOD/3/,GUNK/4/,COAL/5/,MACHI/7/,DIAMO/8/
X	DATA	TCASE/9/,BOTTL/10/
X	DATA WATER/11/,ROPE/12/,KNIFE/13/,SWORD/14/,LAMP/15/,BLAMP/16/
X	DATA	RUG/17/,LEAVE/18/,TROLL/19/,AXE/20/
X	DATA RKNIF/21/,KEYS/23/,BAR/26/,ICE/30/
X	DATA COFFI/33/,TORCH/34/,TBASK/35/,FBASK/36/,IRBOX/39/
X	DATA GHOST/42/,TRUNK/45/,BELL/46/,BOOK/47/,CANDL/48/
X	DATA MATCH/51/,TUBE/54/,PUTTY/55/,WRENC/56/,SCREW/57/
X	DATA	CYCLO/58/,CHALI/59/
X	DATA THIEF/61/,STILL/62/,WINDO/63/,GRATE/65/,DOOR/66/
X	DATA HPOLE/71/,RBUTT/79/,LEAK/78/,RAILI/75/
X	DATA POT/85/,STATU/86/,IBOAT/87/,DBOAT/88/,PUMP/89/,RBOAT/90/
X	DATA STICK/92/,BUOY/94/,SHOVE/96/,GUANO/97/,BALLO/98/,RECEP/99/
X	DATA BROPE/101/,HOOK1/102/,HOOK2/103/,SAFE/105/,SSLOT/107/
X	DATA	BRICK/109/,FUSE/110/
X	DATA GNOME/111/,BLABE/112/,DBALL/113/,TOMB/119/
X	DATA LCASE/123/,CAGE/124/,RCAGE/125/,SPHER/126/,SQBUT/127/
X	DATA FLASK/132/,POOL/133/,SAFFR/134/,BUCKE/137/,ORICE/139/
X	DATA	ECAKE/138/,RDICE/140/
X	DATA BLICE/141/,ROBOT/142/,FTREE/145/,BILLS/148/,PORTR/149/
X	DATA SCOL/151/,ZGNOM/152/,EGG/154/,BEGG/155/,BAUBL/156/
X	DATA	CANAR/157/,BCANA/158/,YLWAL/159/
X	DATA RDWAL/161/,PINDR/164/
X	DATA RBEAM/171/,ODOOR/172/,QDOOR/173/,CDOOR/175/
X	DATA	NUM1/178/
X	DATA NUM8/185/,WARNI/186/,CSLIT/187/,GCARD/188/,STLDR/189/
X	DATA ITOBJ/192/,OPLAY/193/,EVERY/194/
X	DATA	VALUA/195/,SAILO/196/,TEETH/197/,WALL/198/
X	DATA HANDS/200/,LUNGS/201/,AVIAT/202/
X	DATA WNORT/205/,GWATE/209/,MASTER/215/
XC DUNGEON, PAGE 3
XC
XC 1) INITIALIZE DATA STRUCTURES
XC 2) PLAY GAME
XC
X	IF(INIT(X)) CALL GAME
XC						!IF INIT, PLAY GAME.
X	CALL EXIT
XC						!DONE
X	END
END_OF_dmain.F
if test 6633 -ne `wc -c <dmain.F`; then
    echo shar: \"dmain.F\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f dverb1.F -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"dverb1.F\"
else
echo shar: Extracting \"dverb1.F\" \(6815 characters\)
sed "s/^X//" >dverb1.F <<'END_OF_dverb1.F'
XC TAKE-- BASIC TAKE SEQUENCE
XC
XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
XC WRITTEN BY R. M. SUPNIK
XC
XC TAKE AN OBJECT (FOR VERBS TAKE, PUT, DROP, READ, ETC.)
XC
X	LOGICAL FUNCTION TAKE(FLG)
XC
XC DECLARATIONS
XC
X	IMPLICIT INTEGER (A-Z)
X	LOGICAL FLG,OBJACT,OAPPLI,QOPEN,QHERE
X#include "parser.h"
X#include "gamestate.h"
X#include "state.h"
X	COMMON /STAR/ MBASE,STRBIT
X#include "objects.h"
X#include "oflags.h"
XC
X#include "advers.h"
XC
XC FUNCTIONS AND DATA
XC
X	QOPEN(O)=(and(OFLAG2(O),OPENBT).NE.0)
XC TAKE, PAGE 2
XC
X	TAKE=.FALSE.
XC						!ASSUME LOSES.
X	OA=OACTIO(PRSO)
XC						!GET OBJECT ACTION.
X	IF(PRSO.LE.STRBIT) GO TO 100
XC						!STAR?
X	TAKE=OBJACT(X)
XC						!YES, LET IT HANDLE.
X	RETURN
XC
X100	X=OCAN(PRSO)
XC						!INSIDE?
X	IF(PRSO.NE.AVEHIC(WINNER)) GO TO 400
XC						!HIS VEHICLE?
X	CALL RSPEAK(672)
XC						!DUMMY.
X	RETURN
XC
X400	IF(and(OFLAG1(PRSO),TAKEBT).NE.0) GO TO 500
X	IF(.NOT.OAPPLI(OA,0)) CALL RSPEAK(552+RND(5))
X	RETURN
XC
XC OBJECT IS TAKEABLE AND IN POSITION TO BE TAKEN.
XC
X500	IF((X.NE.0).OR. QHERE(PRSO,HERE)) GO TO 600
X	IF(OADV(PRSO).EQ.WINNER) CALL RSPEAK(557)
XC						!ALREADY GOT IT?
X	RETURN
XC
X600	IF(((X.NE.0).AND.(OADV(X).EQ.WINNER)).OR.
X&		((WEIGHT(0,PRSO,WINNER)+OSIZE(PRSO)).LE.MXLOAD))
X&		GO TO 700
X	CALL RSPEAK(558)
XC						!TOO MUCH WEIGHT.
X	RETURN
XC
X700	TAKE=.TRUE.
XC						!AT LAST.
X	IF(OAPPLI(OA,0)) RETURN
XC						!DID IT HANDLE?
X	CALL NEWSTA(PRSO,0,0,0,WINNER)
XC						!TAKE OBJECT FOR WINNER.
X	OFLAG2(PRSO)=or(OFLAG2(PRSO),TCHBT)
X	CALL SCRUPD(OFVAL(PRSO))
XC						!UPDATE SCORE.
X	OFVAL(PRSO)=0
XC						!CANT BE SCORED AGAIN.
X	IF(FLG) CALL RSPEAK(559)
XC						!TELL TAKEN.
X	RETURN
XC
X	END
XC DROP- DROP VERB PROCESSOR
XC
XC DECLARATIONS
XC
X	LOGICAL FUNCTION DROP(Z)
X	IMPLICIT INTEGER (A-Z)
X	LOGICAL F,PUT,OBJACT
X#include "parser.h"
X#include "gamestate.h"
XC
XC ROOMS
X#include "rindex.h"
X#include "objects.h"
X#include "oflags.h"
XC
X#include "advers.h"
X#include "verbs.h"
XC DROP, PAGE 2
XC
X	DROP=.TRUE.
XC						!ASSUME WINS.
X	X=OCAN(PRSO)
XC						!GET CONTAINER.
X	IF(X.EQ.0) GO TO 200
XC						!IS IT INSIDE?
X	IF(OADV(X).NE.WINNER) GO TO 1000
XC						!IS HE CARRYING CON?
X	IF(and(OFLAG2(X),OPENBT).NE.0) GO TO 300
X	CALL RSPSUB(525,ODESC2(X))
XC						!CANT REACH.
X	RETURN
XC
X200	IF(OADV(PRSO).NE.WINNER) GO TO 1000
XC						!IS HE CARRYING OBJ?
X300	IF(AVEHIC(WINNER).EQ.0) GO TO 400
XC						!IS HE IN VEHICLE?
X	PRSI=AVEHIC(WINNER)
XC						!YES,
X	F=PUT(.TRUE.)
XC						!DROP INTO VEHICLE.
X	PRSI=0
XC						!DISARM PARSER.
X	RETURN
XC						!DONE.
XC
X400	CALL NEWSTA(PRSO,0,HERE,0,0)
XC						!DROP INTO ROOM.
X	IF(HERE.EQ.MTREE) CALL NEWSTA(PRSO,0,FORE3,0,0)
X	CALL SCRUPD(OFVAL(PRSO))
XC						!SCORE OBJECT.
X	OFVAL(PRSO)=0
XC						!CANT BE SCORED AGAIN.
X	OFLAG2(PRSO)=or(OFLAG2(PRSO),TCHBT)
XC
X	IF(OBJACT(X)) RETURN
XC						!DID IT HANDLE?
X	I=0
XC						!ASSUME NOTHING TO SAY.
X	IF(PRSA.EQ.DROPW) I=528
X	IF(PRSA.EQ.THROWW) I=529
X	IF((I.NE.0).AND.(HERE.EQ.MTREE)) I=659
X	CALL RSPSUB(I,ODESC2(PRSO))
X	RETURN
XC
X1000	CALL RSPEAK(527)
XC						!DONT HAVE IT.
X	RETURN
XC
X	END
XC PUT- PUT VERB PROCESSOR
XC
XC DECLARATIONS
XC
X	LOGICAL FUNCTION PUT(FLG)
X	IMPLICIT INTEGER (A-Z)
X	LOGICAL TAKE,QOPEN,QHERE,OBJACT,FLG
X#include "parser.h"
X#include "gamestate.h"
XC
XC MISCELLANEOUS VARIABLES
XC
X	COMMON /STAR/ MBASE,STRBIT
X#include "objects.h"
X#include "oflags.h"
X#include "advers.h"
X#include "verbs.h"
XC
XC FUNCTIONS AND DATA
XC
X	QOPEN(R)=((and(OFLAG2(R),OPENBT)).NE.0)
XC PUT, PAGE 2
XC
X	PUT=.FALSE.
X	IF((PRSO.LE.STRBIT).AND.(PRSI.LE.STRBIT)) GO TO 200
X	IF(.NOT.OBJACT(X)) CALL RSPEAK(560)
XC						!STAR
X	PUT=.TRUE.
X	RETURN
XC
X200	IF((QOPEN(PRSI))
X&		.OR.(and(OFLAG1(PRSI),(DOORBT+CONTBT)).NE.0)
X&		.OR.(and(OFLAG2(PRSI),VEHBT).NE.0)) GO TO 300
X	CALL RSPEAK(561)
XC						!CANT PUT IN THAT.
X	RETURN
XC
X300	IF(QOPEN(PRSI)) GO TO 400
XC						!IS IT OPEN?
X	CALL RSPEAK(562)
XC						!NO, JOKE
X	RETURN
XC
X400	IF(PRSO.NE.PRSI) GO TO 500
XC						!INTO ITSELF?
X	CALL RSPEAK(563)
XC						!YES, JOKE.
X	RETURN
XC
X500	IF(OCAN(PRSO).NE.PRSI) GO TO 600
XC						!ALREADY INSIDE.
X	CALL RSPSB2(564,ODESC2(PRSO),ODESC2(PRSI))
X	PUT=.TRUE.
X	RETURN
XC
X600	IF((WEIGHT(0,PRSO,0)+WEIGHT(0,PRSI,0)+OSIZE(PRSO))
X&		.LE.OCAPAC(PRSI)) GO TO 700
X	CALL RSPEAK(565)
XC						!THEN CANT DO IT.
X	RETURN
XC
XC NOW SEE IF OBJECT (OR ITS CONTAINER) IS IN ROOM
XC
X700	J=PRSO
XC						!START SEARCH.
X725	IF(QHERE(J,HERE)) GO TO 750
XC						!IS IT HERE?
X	J=OCAN(J)
X	IF(J.NE.0) GO TO 725
XC						!MORE TO DO?
X	GO TO 800
XC						!NO, SCH FAILS.
XC
X750	SVO=PRSO
XC						!SAVE PARSER.
X	SVI=PRSI
X	PRSA=TAKEW
X	PRSI=0
X	IF(.NOT.TAKE(.FALSE.)) RETURN
XC						!TAKE OBJECT.
X	PRSA=PUTW
X	PRSO=SVO
X	PRSI=SVI
X	GO TO 1000
XC
XC NOW SEE IF OBJECT IS ON PERSON.
XC
X800	IF(OCAN(PRSO).EQ.0) GO TO 1000
XC						!INSIDE?
X	IF(QOPEN(OCAN(PRSO))) GO TO 900
XC						!OPEN?
X	CALL RSPSUB(566,ODESC2(PRSO))
XC						!LOSE.
X	RETURN
XC
X900	CALL SCRUPD(OFVAL(PRSO))
XC						!SCORE OBJECT.
X	OFVAL(PRSO)=0
X	OFLAG2(PRSO)=or(OFLAG2(PRSO),TCHBT)
X	CALL NEWSTA(PRSO,0,0,0,WINNER)
XC						!TEMPORARILY ON WINNER.
XC
X1000	IF(OBJACT(X)) RETURN
XC						!NO, GIVE OBJECT A SHOT.
X	CALL NEWSTA(PRSO,2,0,PRSI,0)
XC						!CONTAINED INSIDE.
X	PUT=.TRUE.
X	RETURN
XC
X	END
XC VALUAC- HANDLES VALUABLES/EVERYTHING
XC
XC DECLARATIONS
XC
X	SUBROUTINE VALUAC(V)
X	IMPLICIT INTEGER (A-Z)
X	LOGICAL LIT,F,F1,TAKE,PUT,DROP,NOTVAL,QHERE
X#include "parser.h"
X#include "gamestate.h"
X#include "objects.h"
X#include "oflags.h"
X#include "verbs.h"
XC
XC FUNCTIONS AND DATA
XC
X	NOTVAL(R)=(SAVEP.EQ.V).AND.(OTVAL(R).LE.0)
XC VALUAC, PAGE 2
XC
X	F=.TRUE.
XC						!ASSUME NO ACTIONS.
X	I=579
XC						!ASSUME NOT LIT.
X	IF(.NOT.LIT(HERE)) GO TO 4000
XC						!IF NOT LIT, PUNT.
X	I=677
XC						!ASSUME WRONG VERB.
X	SAVEP=PRSO
XC						!SAVE PRSO.
X	SAVEH=HERE
XC						!SAVE HERE.
XC
X100	IF(PRSA.NE.TAKEW) GO TO 1000
XC						!TAKE EVERY/VALUA?
X	DO 500 PRSO=1,OLNT
XC						!LOOP THRU OBJECTS.
X	  IF(.NOT.QHERE(PRSO,HERE).OR.
X&		(and(OFLAG1(PRSO),VISIBT).EQ.0).OR.
X&		(and(OFLAG2(PRSO),ACTRBT).NE.0).OR.
X&		NOTVAL(PRSO)) GO TO 500
X	  IF((and(OFLAG1(PRSO),TAKEBT).EQ.0).AND.
X&		(and(OFLAG2(PRSO),TRYBT).EQ.0)) GO TO 500
X	  F=.FALSE.
X	  CALL RSPSUB(580,ODESC2(PRSO))
X	  F1=TAKE(.TRUE.)
X	  IF(SAVEH.NE.HERE) RETURN
X500	CONTINUE
X	GO TO 3000
XC
X1000	IF(PRSA.NE.DROPW) GO TO 2000
XC						!DROP EVERY/VALUA?
X	DO 1500 PRSO=1,OLNT
X	  IF((OADV(PRSO).NE.WINNER).OR.NOTVAL(PRSO))
X&		GO TO 1500
X	  F=.FALSE.
X	  CALL RSPSUB(580,ODESC2(PRSO))
X	  F1=DROP(.TRUE.)
X	  IF(SAVEH.NE.HERE) RETURN
X1500	CONTINUE
X	GO TO 3000
XC
X2000	IF(PRSA.NE.PUTW) GO TO 3000
XC						!PUT EVERY/VALUA?
X	DO 2500 PRSO=1,OLNT
XC						!LOOP THRU OBJECTS.
X	  IF((OADV(PRSO).NE.WINNER)
X&		.OR.(PRSO.EQ.PRSI).OR.NOTVAL(PRSO).OR.
X&		(and(OFLAG1(PRSO),VISIBT).EQ.0)) GO TO 2500
X	  F=.FALSE.
X	  CALL RSPSUB(580,ODESC2(PRSO))
X	  F1=PUT(.TRUE.)
X	  IF(SAVEH.NE.HERE) RETURN
X2500	CONTINUE
XC
X3000	I=581
X	IF(SAVEP.EQ.V) I=582
XC						!CHOOSE MESSAGE.
X4000	IF(F) CALL RSPEAK(I)
XC						!IF NOTHING, REPORT.
X	RETURN
X	END
END_OF_dverb1.F
if test 6815 -ne `wc -c <dverb1.F`; then
    echo shar: \"dverb1.F\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f np.F -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"np.F\"
else
echo shar: Extracting \"np.F\" \(4769 characters\)
sed "s/^X//" >np.F <<'END_OF_np.F'
XC RDLINE-	READ INPUT LINE
XC
XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
XC WRITTEN BY R. M. SUPNIK
XC
XC DECLARATIONS
XC
X	SUBROUTINE RDLINE(BUFFER,LENGTH,WHO)
X	IMPLICIT INTEGER(A-Z)
X	CHARACTER BUFFER(78)
X#ifndef PDP
X	character*78 sysbuf
X#endif
X#include "parser.h"
X#include "io.h"
X
X#ifdef PDP
X5	if (WHO .eq. 1) call prompt
XC	read a line of input
X90	call rdlin(BUFFER,LENGTH,WHO)
X#else
X5	GO TO (90,10),WHO+1
XC						!SEE WHO TO PROMPT FOR.
X10	WRITE(OUTCH,50)
XC						!PROMPT FOR GAME.
X50	FORMAT(' >',$)
X
X90	READ(INPCH,100) BUFFER
X100	FORMAT(78A1)
X
X	DO 200 LENGTH=78,1,-1
X	  IF(BUFFER(LENGTH).NE.' ') GO TO 250
X200	CONTINUE
X	GO TO 5
XC						!TRY AGAIN.
X
XC
XC	check for shell escape here before things are
XC	converted to upper case
XC
X250	if (buffer(1) .ne. '!') go to 300
X	do 275 j=2,length
X	  sysbuf(j-1:j-1) = buffer(j)
X275	continue
X	sysbuf(j:j) = char(0)
X	call system(sysbuf)
X	go to 5
X
XC CONVERT TO UPPER CASE
X300	DO 400 I=1,LENGTH
X 	  IF(and((BUFFER(I).GE.'a'),(BUFFER(I).LE.'z')))
X&		BUFFER(I)=char(ichar(BUFFER(I))-32)
X400	CONTINUE
X#endif PDP
X
X	if(LENGTH.EQ.0) GO TO 5
X	PRSCON=1
XC						!RESTART LEX SCAN.
X	RETURN
X	END
XC PARSE-	TOP LEVEL PARSE ROUTINE
XC
XC DECLARATIONS
XC
XC THIS ROUTINE DETAILS ON BIT 0 OF PRSFLG
XC
X	LOGICAL FUNCTION PARSE(INBUF,INLNT,VBFLAG)
X	IMPLICIT INTEGER(A-Z)
X	CHARACTER INBUF(78)
X	LOGICAL LEX,SYNMCH,VBFLAG
X	INTEGER OUTBUF(40)
X#include "debug.h"
X#include "parser.h"
X#include "xsrch.h"
XC
X#ifdef debug
X	DFLAG=and(PRSFLG,1).NE.0
X#endif
X	PARSE=.FALSE.
XC						!ASSUME FAILS.
X	PRSA=0
XC						!ZERO OUTPUTS.
X	PRSI=0
X	PRSO=0
XC
X#ifdef PDP
XC	LEX recoded in C for pdp version (see lex.c)
X	if(.not. lex(INBUF,INLNT,OUTBUF,OUTLNT,VBFLAG,PRSCON)) goto 100
X#else
X	IF(.NOT.LEX(INBUF,INLNT,OUTBUF,OUTLNT,VBFLAG)) GO TO 100
X#endif
X	IF(SPARSE(OUTBUF,OUTLNT,VBFLAG)) 100,200,300
XC						!DO SYN SCAN.
XC
XC PARSE REQUIRES VALIDATION
XC
X200	IF(.NOT.VBFLAG) GO TO 350
XC						!ECHO MODE, FORCE FAIL.
X	IF(.NOT.SYNMCH(X)) GO TO 100
XC						!DO SYN MATCH.
X	IF(and((PRSO.GT.0),(PRSO.LT.XMIN))) LASTIT=PRSO
XC
XC SUCCESSFUL PARSE OR SUCCESSFUL VALIDATION
XC
X300	PARSE=.TRUE.
X350	CALL ORPHAN(0,0,0,0,0)
XC						!CLEAR ORPHANS.
X#ifdef debug
X	if(dflag) write(0,*) "parse good"
X	IF(DFLAG) PRINT 10,PARSE,PRSA,PRSO,PRSI
X10	FORMAT(' PARSE RESULTS- ',L7,3I7)
X#endif
X	RETURN
XC
XC PARSE FAILS, DISALLOW CONTINUATION
XC
X100	PRSCON=1
X#ifdef debug
X	if(dflag) write(0,*) "parse failed"
X	IF(DFLAG) PRINT 10,PARSE,PRSA,PRSO,PRSI
X#endif
X	RETURN
XC
X	END
XC ORPHAN- SET UP NEW ORPHANS
XC
XC DECLARATIONS
XC
X	SUBROUTINE ORPHAN(O1,O2,O3,O4,O5)
X	IMPLICIT INTEGER(A-Z)
X	COMMON /ORPHS/ A,B,C,D,E
XC
X	A=O1
XC						!SET UP NEW ORPHANS.
X	B=O2
X	C=O3
X	D=O4
X	E=O5
X	RETURN
X	END
X#ifndef PDP
XC LEX-	LEXICAL ANALYZER
XC
XC
XC THIS ROUTINE DETAILS ON BIT 1 OF PRSFLAG
XC
X	LOGICAL FUNCTION LEX(INBUF,INLNT,OUTBUF,OP,VBFLAG)
X	IMPLICIT INTEGER(A-Z)
X	CHARACTER INBUF(78),J,DLIMIT(9)
X	INTEGER OUTBUF(40)
X	LOGICAL VBFLAG
X#include "parser.h"
XC
X#include "debug.h"
XC
X	DATA DLIMIT/'A','Z',o'100','1','9',o'22','-','-',o'22'/
XC
X	DO 100 I=1,40
XC						!CLEAR OUTPUT BUF.
X	  OUTBUF(I)=0
X100	CONTINUE
XC
X#ifdef debug
X	DFLAG=and(PRSFLG,2).NE.0
X#endif debug
X	LEX=.FALSE.
XC						!ASSUME LEX FAILS.
X	OP=-1
XC						!OUTPUT PTR.
X50	OP=OP+2
XC						!ADV OUTPUT PTR.
X	CP=0
XC						!CHAR PTR=0.
XC
X200	IF(PRSCON.GT.INLNT) GO TO 1000
XC						!END OF INPUT?
X	J=INBUF(PRSCON)
XC						!NO, GET CHARACTER,
X	PRSCON=PRSCON+1
XC						!ADVANCE PTR.
X	IF(J.EQ.'.') GO TO 1000
XC						!END OF COMMAND?
X	IF(J.EQ.',') GO TO 1000
XC						!END OF COMMAND?
X	IF(J.EQ.' ') GO TO 6000
XC						!SPACE?
X	DO 500 I=1,9,3
XC						!SCH FOR CHAR.
X	  IF(and((J.GE.DLIMIT(I)),(J.LE.DLIMIT(I+1))))
X&		GO TO 4000
X500	CONTINUE
XC
X	IF(VBFLAG) CALL RSPEAK(601)
XC						!GREEK TO ME, FAIL.
X	RETURN
XC
XC END OF INPUT, SEE IF PARTIAL WORD AVAILABLE.
XC
X1000	IF(PRSCON.GT.INLNT) PRSCON=1
XC						!FORCE PARSE RESTART.
X	IF(and((CP.EQ.0),(OP.EQ.1))) RETURN
X	IF(CP.EQ.0) OP=OP-2
XC						!ANY LAST WORD?
X	LEX=.TRUE.
X#ifdef debug
X	IF(DFLAG) PRINT 10,CP,OP,PRSCON,(OUTBUF(I),I=1,OP+1)
X10	FORMAT(' LEX RESULTS- ',3I7/1X,10O7)
X#endif debug
X	RETURN
XC
XC LEGITIMATE CHARACTERS: LETTER, DIGIT, OR HYPHEN.
XC
X4000	J1=ichar(J)-ichar(DLIMIT(I+2))
X#ifdef debug
X	IF(DFLAG) PRINT 20,J,J1,CP
X20	FORMAT(' LEX- CHAR= ',3I7)
X#endif debug
X	IF(CP.GE.6) GO TO 200
XC						!IGNORE IF TOO MANY CHAR.
X	K=OP+(CP/3)
XC						!COMPUTE WORD INDEX.
X	GO TO (4100,4200,4300),(MOD(CP,3)+1)
XC						!BRANCH ON CHAR.
X4100	J2=J1*780
XC						!CHAR 1... *780
X	OUTBUF(K)=OUTBUF(K)+J2+J2
XC						!*1560 (40 ADDED BELOW).
X4200	OUTBUF(K)=OUTBUF(K)+(J1*39)
XC						!*39 (1 ADDED BELOW).
X4300	OUTBUF(K)=OUTBUF(K)+J1
XC						!*1.
X	CP=CP+1
X	GO TO 200
XC						!GET NEXT CHAR.
XC
XC SPACE
XC
X6000	IF(CP.EQ.0) GO TO 200
XC						!ANY WORD YET?
X	GO TO 50
XC						!YES, ADV OP.
XC
X	END
X#endif PDP
END_OF_np.F
if test 4769 -ne `wc -c <np.F`; then
    echo shar: \"np.F\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f np2.F -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"np2.F\"
else
echo shar: Extracting \"np2.F\" \(4830 characters\)
sed "s/^X//" >np2.F <<'END_OF_np2.F'
XC GETOBJ--	FIND OBJ DESCRIBED BY ADJ, NAME PAIR
XC
XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
XC WRITTEN BY R. M. SUPNIK
XC
XC DECLARATIONS
XC
XC THIS ROUTINE DETAILS ON BIT 3 OF PRSFLG
XC
X	INTEGER FUNCTION GETOBJ(OIDX,AIDX,SPCOBJ)
X	IMPLICIT INTEGER(A-Z)
X	LOGICAL THISIT,GHERE,LIT,CHOMP
X#include "parser.h"
X#include "gamestate.h"
XC
XC MISCELLANEOUS VARIABLES
XC
X	COMMON /STAR/ MBASE,STRBIT
X#include "debug.h"
X#include "objects.h"
X#include "oflags.h"
X#include "advers.h"
X#include "vocab.h"
XC GETOBJ, PAGE 2
XC
X#ifdef debug
X	DFLAG=and(PRSFLG, 8).NE.0
X#endif debug
X	CHOMP=.FALSE.
X	AV=AVEHIC(WINNER)
X	OBJ=0
XC						!ASSUME DARK.
X	IF(.NOT.LIT(HERE)) GO TO 200
XC						!LIT?
XC
X	OBJ=SCHLST(OIDX,AIDX,HERE,0,0,SPCOBJ)
XC						!SEARCH ROOM.
X#ifdef debug
X	IF(DFLAG) PRINT 10,OBJ
X10	FORMAT(' SCHLST- ROOM SCH ',I6)
X#endif debug
X	IF(OBJ) 1000,200,100
XC						!TEST RESULT.
X100	IF((AV.EQ.0).OR.(AV.EQ.OBJ).OR.
X&		(and(OFLAG2(OBJ),FINDBT).NE.0)) GO TO 200
X	IF(OCAN(OBJ).EQ.AV) GO TO 200
XC						!TEST IF REACHABLE.
X	CHOMP=.TRUE.
XC						!PROBABLY NOT.
XC
X200	IF(AV.EQ.0) GO TO 400
XC						!IN VEHICLE?
X	NOBJ=SCHLST(OIDX,AIDX,0,AV,0,SPCOBJ)
XC						!SEARCH VEHICLE.
X#ifdef debug
X	IF(DFLAG) PRINT 20,NOBJ
X20	FORMAT(' SCHLST- VEH SCH  ',I6)
X#endif debug
X	IF(NOBJ) 1100,400,300
XC						!TEST RESULT.
X300	CHOMP=.FALSE.
XC						!REACHABLE.
X	IF(OBJ.EQ.NOBJ) GO TO 400
XC						!SAME AS BEFORE?
X	IF(OBJ.NE.0) NOBJ=-NOBJ
XC						!AMB RESULT?
X	OBJ=NOBJ
XC
X400	NOBJ=SCHLST(OIDX,AIDX,0,0,WINNER,SPCOBJ)
XC						!SEARCH ADVENTURER.
X#ifdef debug
X	IF(DFLAG) PRINT 30,NOBJ
X30	FORMAT(' SCHLST- ADV SCH  ',I6)
X#endif debug
X	IF(NOBJ) 1100,600,500
XC						!TEST RESULT
X500	IF(OBJ.NE.0) NOBJ=-NOBJ
XC						!AMB RESULT?
X1100	OBJ=NOBJ
XC						!RETURN NEW OBJECT.
X600	IF(CHOMP) OBJ=-10000
XC						!UNREACHABLE.
X1000	GETOBJ=OBJ
XC
X	IF(GETOBJ.NE.0) GO TO 1500
XC						!GOT SOMETHING?
X	DO 1200 I=STRBIT+1,OLNT
XC						!NO, SEARCH GLOBALS.
X	  IF(.NOT.THISIT(OIDX,AIDX,I,SPCOBJ)) GO TO 1200
X	  IF(.NOT.GHERE(I,HERE)) GO TO 1200
XC						!CAN IT BE HERE?
X	  IF(GETOBJ.NE.0) GETOBJ=-I
XC						!AMB MATCH?
X	  IF(GETOBJ.EQ.0) GETOBJ=I
X1200	CONTINUE
XC
X1500	CONTINUE
XC						!END OF SEARCH.
X#ifdef debug
X	IF(DFLAG) PRINT 40,GETOBJ
X40	FORMAT(' SCHLST- RESULT   ',I6)
X#endif debug
X	RETURN
X	END
XC SCHLST--	SEARCH FOR OBJECT
XC
XC DECLARATIONS
XC
X	INTEGER FUNCTION SCHLST(OIDX,AIDX,RM,CN,AD,SPCOBJ)
X	IMPLICIT INTEGER(A-Z)
X	LOGICAL THISIT,QHERE,NOTRAN,NOVIS
XC
X	COMMON /STAR/ MBASE,STRBIT
X#include "objects.h"
X#include "oflags.h"
XC
XC FUNCTIONS AND DATA
XC
X	NOTRAN(O)=(and(OFLAG1(O),TRANBT).EQ.0).AND.
X&		(and(OFLAG2(O),OPENBT).EQ.0)
X	NOVIS(O)=(and(OFLAG1(O),VISIBT).EQ.0)
XC
X	SCHLST=0
XC						!NO RESULT.
X	DO 1000 I=1,OLNT
XC						!SEARCH OBJECTS.
X	  IF(NOVIS(I).OR.
X&		(((RM.EQ.0).OR.(.NOT.QHERE(I,RM))).AND.
X&		 ((CN.EQ.0).OR.(OCAN(I).NE.CN)).AND.
X&		 ((AD.EQ.0).OR.(OADV(I).NE.AD)))) GO TO 1000
X	  IF(.NOT.THISIT(OIDX,AIDX,I,SPCOBJ)) GO TO 200
X	  IF(SCHLST.NE.0) GO TO 2000
XC						!GOT ONE ALREADY?
X	  SCHLST=I
XC						!NO.
XC
XC IF OPEN OR TRANSPARENT, SEARCH THE OBJECT ITSELF.
XC
X200	  IF(NOTRAN(I)) GO TO 1000
XC
XC SEARCH IS CONDUCTED IN REVERSE.  ALL OBJECTS ARE CHECKED TO
XC SEE IF THEY ARE AT SOME LEVEL OF CONTAINMENT INSIDE OBJECT 'I'.
XC IF THEY ARE AT LEVEL 1, OR IF ALL LINKS IN THE CONTAINMENT
XC CHAIN ARE OPEN, VISIBLE, AND HAVE SEARCHME SET, THEY CAN QUALIFY
XC AS A POTENTIAL MATCH.
XC
X	  DO 500 J=1,OLNT
XC						!SEARCH OBJECTS.
X	    IF(NOVIS(J).OR. (.NOT.THISIT(OIDX,AIDX,J,SPCOBJ)))
X&		GO TO 500
X	    X=OCAN(J)
XC						!GET CONTAINER.
X300	    IF(X.EQ.I) GO TO 400
XC						!INSIDE TARGET?
X	    IF(X.EQ.0) GO TO 500
XC						!INSIDE ANYTHING?
X	    IF(NOVIS(X).OR.NOTRAN(X).OR.
X&		(and(OFLAG2(X),SCHBT).EQ.0)) GO TO 500
X	    X=OCAN(X)
XC						!GO ANOTHER LEVEL.
X	    GO TO 300
XC
X400	    IF(SCHLST.NE.0) GO TO 2000
XC						!ALREADY GOT ONE?
X	    SCHLST=J
XC						!NO.
X500	  CONTINUE
XC
X1000	CONTINUE
X	RETURN
XC
X2000	SCHLST=-SCHLST
XC						!AMB RETURN.
X	RETURN
XC
X	END
XC
XC THISIT--	VALIDATE OBJECT VS DESCRIPTION
XC
XC DECLARATIONS
XC
X	LOGICAL  FUNCTION  THISIT(OIDX,AIDX,OBJ,SPCOBJ)
X	IMPLICIT INTEGER(A-Z)
X	LOGICAL  NOTEST
X#include "vocab.h"
XC
XC FUNCTIONS AND DATA
XC
X	NOTEST(O)=(O.LE.0).OR.(O.GE.R50MIN)
XC
XC    THE FOLLOWING DATA STATEMENT USED RADIX-50 NOTATION (R50MIN/1RA/)
XC       IN RADIX-50 NOTATION, AN "A" IN THE FIRST POSITION IS
XC       ENCODED AS 1*40*40 = 1600.
XC
X	DATA R50MIN/1600/
XC
X	THISIT=.FALSE.
XC						!ASSUME NO MATCH.
X	IF((SPCOBJ.NE.0).AND.(OBJ.EQ.SPCOBJ)) GO TO 500
XC
XC CHECK FOR OBJECT NAMES
XC
X	I=OIDX+1
X100	I=I+1
X	IF(NOTEST(OVOC(I))) RETURN
XC						!IF DONE, LOSE.
X	IF(OVOC(I).NE.OBJ) GO TO 100
XC						!IF FAIL, CONT.
XC
X	IF(AIDX.EQ.0) GO TO 500
XC						!ANY ADJ?
X	I=AIDX+1
X200	I=I+1
X	IF(NOTEST(AVOC(I))) RETURN
XC						!IF DONE, LOSE.
X	IF(AVOC(I).NE.OBJ) GO TO 200
XC						!IF FAIL, CONT.
XC
X500	THISIT=.TRUE.
X	RETURN
X	END
END_OF_np2.F
if test 4830 -ne `wc -c <np2.F`; then
    echo shar: \"np2.F\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f nrooms.F -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"nrooms.F\"
else
echo shar: Extracting \"nrooms.F\" \(6745 characters\)
sed "s/^X//" >nrooms.F <<'END_OF_nrooms.F'
XC RAPPL2- SPECIAL PURPOSE ROOM ROUTINES, PART 2
XC
XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
XC WRITTEN BY R. M. SUPNIK
XC
XC DECLARATIONS
XC
X	LOGICAL FUNCTION RAPPL2(RI)
X	IMPLICIT INTEGER (A-Z)
X	LOGICAL QOPEN,QHERE
X#include "parser.h"
X#include "gamestate.h"
X#include "state.h"
X#include "io.h"
X#include "rooms.h"
X#include "rflag.h"
X#include "rindex.h"
X#include "objects.h"
X#include "oflags.h"
X#include "oindex.h"
X#include "xsrch.h"
X#include "clock.h"
X#include "advers.h"
X#include "verbs.h"
X#include "flags.h"
XC
XC FUNCTIONS AND DATA
XC
X	QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
X	DATA NEWRMS/38/
XC RAPPL2, PAGE 2
XC
X	RAPPL2=.TRUE.
X	GO TO (38000,39000,40000,41000,42000,43000,44000,
X&		45000,46000,47000,48000,49000,50000,
X&		51000,52000,53000,54000,55000,56000,
X&		57000,58000,59000,60000),
X&		(RI-NEWRMS+1)
X	CALL BUG(70,RI)
X	RETURN
XC
XC R38--	MIRROR D ROOM
XC
X38000	IF(PRSA.EQ.LOOKW) CALL LOOKTO(FDOOR,MRG,0,682,681)
X	RETURN
XC
XC R39--	MIRROR G ROOM
XC
X39000	IF(PRSA.EQ.WALKIW) CALL JIGSUP(685)
X	RETURN
XC
XC R40--	MIRROR C ROOM
XC
X40000	IF(PRSA.EQ.LOOKW) CALL LOOKTO(MRG,MRB,683,0,681)
X	RETURN
XC
XC R41--	MIRROR B ROOM
XC
X41000	IF(PRSA.EQ.LOOKW) CALL LOOKTO(MRC,MRA,0,0,681)
X	RETURN
XC
XC R42--	MIRROR A ROOM
XC
X42000	IF(PRSA.EQ.LOOKW) CALL LOOKTO(MRB,0,0,684,681)
X	RETURN
XC RAPPL2, PAGE 3
XC
XC R43--	MIRROR C EAST/WEST
XC
X43000	IF(PRSA.EQ.LOOKW) CALL EWTELL(HERE,683)
X	RETURN
XC
XC R44--	MIRROR B EAST/WEST
XC
X44000	IF(PRSA.EQ.LOOKW) CALL EWTELL(HERE,686)
X	RETURN
XC
XC R45--	MIRROR A EAST/WEST
XC
X45000	IF(PRSA.EQ.LOOKW) CALL EWTELL(HERE,687)
X	RETURN
XC
XC R46--	INSIDE MIRROR
XC
X46000	IF(PRSA.NE.LOOKW) RETURN
XC						!LOOK?
X	CALL RSPEAK(688)
XC						!DESCRIBE
XC
XC NOW DESCRIBE POLE STATE.
XC
XC CASES 1,2--	MDIR=270 & MLOC=MRB, POLE IS UP OR IN HOLE
XC CASES 3,4--	MDIR=0 V MDIR=180, POLE IS UP OR IN CHANNEL
XC CASE 5--	POLE IS UP
XC
X	I=689
XC						!ASSUME CASE 5.
X	IF((MDIR.EQ.270).AND.(MLOC.EQ.MRB))
X&		I=690+MIN0(POLEUF,1)
X	IF(MOD(MDIR,180).EQ.0)
X&		I=692+MIN0(POLEUF,1)
X	CALL RSPEAK(I)
XC						!DESCRIBE POLE.
X	CALL RSPSUB(694,695+(MDIR/45))
XC						!DESCRIBE ARROW.
X	RETURN
XC RAPPL2, PAGE 4
XC
XC R47--	MIRROR EYE ROOM
XC
X47000	IF(PRSA.NE.LOOKW) RETURN
XC						!LOOK?
X	I=704
XC						!ASSUME BEAM STOP.
X	DO 47100 J=1,OLNT
X	  IF(QHERE(J,HERE).AND.(J.NE.RBEAM)) GO TO 47200
X47100	CONTINUE
X	I=703
X47200	CALL RSPSUB(I,ODESC2(J))
XC						!DESCRIBE BEAM.
X	CALL LOOKTO(MRA,0,0,0,0)
XC						!LOOK NORTH.
X	RETURN
XC
XC R48--	INSIDE CRYPT
XC
X48000	IF(PRSA.NE.LOOKW) RETURN
XC						!LOOK?
X	I=46
XC						!CRYPT IS OPEN/CLOSED.
X	IF(QOPEN(TOMB)) I=12
X	CALL RSPSUB(705,I)
X	RETURN
XC
XC R49--	SOUTH CORRIDOR
XC
X49000	IF(PRSA.NE.LOOKW) RETURN
XC						!LOOK?
X	CALL RSPEAK(706)
XC						!DESCRIBE.
X	I=46
XC						!ODOOR IS OPEN/CLOSED.
X	IF(QOPEN(ODOOR)) I=12
X	IF(LCELL.EQ.4) CALL RSPSUB(707,I)
XC						!DESCRIBE ODOOR IF THERE.
X	RETURN
XC
XC R50--	BEHIND DOOR
XC
X50000	IF(PRSA.NE.WALKIW) GO TO 50100
XC						!WALK IN?
X	CFLAG(CEVFOL)=.TRUE.
XC						!MASTER FOLLOWS.
X	CTICK(CEVFOL)=-1
X	RETURN
XC
X50100	IF(PRSA.NE.LOOKW) RETURN
XC						!LOOK?
X	I=46
XC						!QDOOR IS OPEN/CLOSED.
X	IF(QOPEN(QDOOR)) I=12
X	CALL RSPSUB(708,I)
X	RETURN
XC RAPPL2, PAGE 5
XC
XC R51--	FRONT DOOR
XC
X51000	IF(PRSA.EQ.WALKIW) CTICK(CEVFOL)=0
XC						!IF EXITS, KILL FOLLOW.
X	IF(PRSA.NE.LOOKW) RETURN
XC						!LOOK?
X	CALL LOOKTO(0,MRD,709,0,0)
XC						!DESCRIBE SOUTH.
X	I=46
XC						!PANEL IS OPEN/CLOSED.
X	IF(INQSTF) I=12
XC						!OPEN IF INQ STARTED.
X	J=46
XC						!QDOOR IS OPEN/CLOSED.
X	IF(QOPEN(QDOOR)) J=12
X	CALL RSPSB2(710,I,J)
X	RETURN
XC
XC R52--	NORTH CORRIDOR
XC
X52000	IF(PRSA.NE.LOOKW) RETURN
XC						!LOOK?
X	I=46
X	IF(QOPEN(CDOOR)) I=12
XC						!CDOOR IS OPEN/CLOSED.
X	CALL RSPSUB(711,I)
X	RETURN
XC
XC R53--	PARAPET
XC
X53000	IF(PRSA.EQ.LOOKW) CALL RSPSUB(712,712+PNUMB)
X	RETURN
XC
XC R54--	CELL
XC
X54000	IF(PRSA.NE.LOOKW) RETURN
XC						!LOOK?
X	I=721
XC						!CDOOR IS OPEN/CLOSED.
X	IF(QOPEN(CDOOR)) I=722
X	CALL RSPEAK(I)
X	I=46
XC						!ODOOR IS OPEN/CLOSED.
X	IF(QOPEN(ODOOR)) I=12
X	IF(LCELL.EQ.4) CALL RSPSUB(723,I)
XC						!DESCRIBE.
X	RETURN
XC
XC R55--	PRISON CELL
XC
X55000	IF(PRSA.EQ.LOOKW) CALL RSPEAK(724)
XC						!LOOK?
X	RETURN
XC
XC R56--	NIRVANA CELL
XC
X56000	IF(PRSA.NE.LOOKW) RETURN
XC						!LOOK?
X	I=46
XC						!ODOOR IS OPEN/CLOSED.
X	IF(QOPEN(ODOOR)) I=12
X	CALL RSPSUB(725,I)
X	RETURN
XC RAPPL2, PAGE 6
XC
XC R57--	NIRVANA AND END OF GAME
XC
X57000	IF(PRSA.NE.WALKIW) RETURN
XC						!WALKIN?
X	CALL RSPEAK(726)
X	CALL SCORE(.FALSE.)
XC moved to exit routine	CLOSE(DBCH)
X	CALL EXIT
XC
XC R58--	TOMB ROOM
XC
X58000	IF(PRSA.NE.LOOKW) RETURN
XC						!LOOK?
X	I=46
XC						!TOMB IS OPEN/CLOSED.
X	IF(QOPEN(TOMB)) I=12
X	CALL RSPSUB(792,I)
X	RETURN
XC
XC R59--	PUZZLE SIDE ROOM
XC
X59000	IF(PRSA.NE.LOOKW) RETURN
XC						!LOOK?
X	I=861
XC						!ASSUME DOOR CLOSED.
X	IF(CPOUTF) I=862
XC						!OPEN?
X	CALL RSPEAK(I)
XC						!DESCRIBE.
X	RETURN
XC
XC R60--	PUZZLE ROOM
XC
X60000	IF(PRSA.NE.LOOKW) RETURN
XC						!LOOK?
X	IF(CPUSHF) GO TO 60100
XC						!STARTED PUZZLE?
X	CALL RSPEAK(868)
XC						!NO, DESCRIBE.
X	IF(and(OFLAG2(WARNI),TCHBT).NE.0) CALL RSPEAK(869)
X	RETURN
XC
X60100	CALL CPINFO(880,CPHERE)
XC						!DESCRIBE ROOM.
X	RETURN
XC
X	END
XC LOOKTO--	DESCRIBE VIEW IN MIRROR HALLWAY
XC
XC DECLARATIONS
XC
X	SUBROUTINE LOOKTO(NRM,SRM,NT,ST,HT)
X	IMPLICIT INTEGER(A-Z)
X#include "gamestate.h"
X#include "flags.h"
XC LOOKTO, PAGE 2
XC
X	CALL RSPEAK(HT)
XC						!DESCRIBE HALL.
X	CALL RSPEAK(NT)
XC						!DESCRIBE NORTH VIEW.
X	CALL RSPEAK(ST)
XC						!DESCRIBE SOUTH VIEW.
X	DIR=0
XC						!ASSUME NO DIRECTION.
X	IF(IABS(MLOC-HERE).NE.1) GO TO 200
XC						!MIRROR TO N OR S?
X	IF(MLOC.EQ.NRM) DIR=695
X	IF(MLOC.EQ.SRM) DIR=699
XC						!DIR=N/S.
X	IF(MOD(MDIR,180).NE.0) GO TO 100
XC						!MIRROR N-S?
X	CALL RSPSUB(847,DIR)
XC						!YES, HE SEES PANEL
X	CALL RSPSB2(848,DIR,DIR)
XC						!AND NARROW ROOMS.
X	GO TO 200
XC
X100	M1=MRHERE(HERE)
XC						!WHICH MIRROR?
X	MRBF=0
XC						!ASSUME INTACT.
X	IF(((M1.EQ.1).AND..NOT.MR1F).OR.
X&	  ((M1.EQ.2).AND..NOT.MR2F)) MRBF=1
X	CALL RSPSUB(849+MRBF,DIR)
XC						!DESCRIBE.
X	IF((M1.EQ.1).AND.MROPNF) CALL RSPEAK(823+MRBF)
X	IF(MRBF.NE.0) CALL RSPEAK(851)
XC
X200	I=0
XC						!ASSUME NO MORE TO DO.
X	IF((NT.EQ.0).AND.((DIR.EQ.0).OR.(DIR.EQ.699))) I=852
X	IF((ST.EQ.0).AND.((DIR.EQ.0).OR.(DIR.EQ.695))) I=853
X	IF((NT+ST+DIR).EQ.0) I=854
X	IF(HT.NE.0) CALL RSPEAK(I)
XC						!DESCRIBE HALLS.
X	RETURN
XC
X	END
XC EWTELL--	DESCRIBE E/W NARROW ROOMS
XC
XC DECLARATIONS
XC
X	SUBROUTINE EWTELL(RM,ST)
X	IMPLICIT INTEGER(A-Z)
X	LOGICAL M1
XC
XC ROOMS
X#include "rindex.h"
X#include "flags.h"
XC EWTELL, PAGE 2
XC
XC NOTE THAT WE ARE EAST OR WEST OF MIRROR, AND
XC MIRROR MUST BE N-S.
XC
X	M1=(MDIR+(MOD(RM-MRAE,2)*180)).EQ.180
X	I=819+MOD(RM-MRAE,2)
XC						!GET BASIC E/W STRING.
X	IF((M1.AND..NOT.MR1F).OR.(.NOT.M1.AND..NOT.MR2F))
X&		I=I+2
X	CALL RSPEAK(I)
X	IF(M1.AND.MROPNF) CALL RSPEAK(823+((I-819)/2))
X	CALL RSPEAK(825)
X	CALL RSPEAK(ST)
X	RETURN
XC
X	END
END_OF_nrooms.F
if test 6745 -ne `wc -c <nrooms.F`; then
    echo shar: \"nrooms.F\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f oflags.h -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"oflags.h\"
else
echo shar: Extracting \"oflags.h\" \(269 characters\)
sed "s/^X//" >oflags.h <<'END_OF_oflags.h'
XC
X	COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
X&		NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
X&		TOOLBT,TURNBT,ONBT
X	COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
X&		WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
X&		TCHBT,VEHBT,SCHBT
END_OF_oflags.h
if test 269 -ne `wc -c <oflags.h`; then
    echo shar: \"oflags.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f speak.F -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"speak.F\"
else
echo shar: Extracting \"speak.F\" \(3842 characters\)
sed "s/^X//" >speak.F <<'END_OF_speak.F'
X#include "files.h"
X
X#ifndef RTEXTFILE
X#define RTEXTFILE '/usr/games/lib/dunlib/rtext.dat'
X#endif
X
X#ifndef TEXTFILE
X#define TEXTFILE '/usr/games/lib/dunlib/dtext.dat'
X#endif
X
XC
XC	manual speak routine
XC	gets dungeon messages and prints them
XC	(only used for pdp version)
XC
X	program speak
X	IMPLICIT      INTEGER(A-Z)
XC
X	COMMON /CHAN/ INPCH,OUTCH,DBCH
X#include "mindex.h"
XC	
XC	load the lookup table
XC
X	OPEN(UNIT=9,file=RTEXTFILE,
X&		status='OLD',IOSTAT=IO,
X&		FORM='formatted',ACCESS='SEQUENTIAL',err=50)
XC
X	call load
XC
XC	open the message file
XC
X	DBCH=2
XC
X	OPEN(UNIT=DBCH,file=TEXTFILE,
X&		status='OLD',IOSTAT=IO,
X&		FORM='UNFORMATTED',ACCESS='DIRECT',recl=76,err=60)
XC
X	print 20
X20	format('Sigh... '/)
XC
XC	get numbers and call speaking program
XC
X10	continue 
XC
X	call inprd(mesage,i,j)
X	call RSPSB2(mesage,i,j)
X	goto 10
XC
XC INITIALIZATION ERROR
XC
X50	print 960
X	print 980
X	goto 99
X60	print 970
X	print 980
X	goto 99
X960	FORMAT(' I can''t open ',RTEXTFILE,'.')
X970	FORMAT(' I can''t open ',TEXTFILE,'.')
X980	FORMAT(' Suddenly a sinister, wraithlike figure appears before '
X&	'you,'/' seeming to float in the air.  In a low, sorrowful voice'
X&	' he says,'/' "Alas, the very nature of the world has changed, '
X&	'and the dungeon'/' cannot be found.  All must now pass away."'
X&	'  Raising his oaken staff'/' in farewell, he fades into the '
X&	'spreading darkness.  In his place'/' appears a tastefully '
X&	'lettered sign reading:'//23X,'INITIALIZATION FAILURE'//
X&	' The darkness becomes all encompassing, and your vision fails.')
X99	stop
X	end
XC
XC RSPSB2-- OUTPUT RANDOM MESSAGE WITH SUBSTITUTABLE ARGUMENTS
XC
XC CALLED BY--
XC
XC	CALL RSPSB2(MSGNUM,S1,S2)
XC
X	SUBROUTINE    RSPSB2(A,B,C)
X	IMPLICIT      INTEGER(A-Z)
X	CHARACTER*74  B1,B2,B3
X	INTEGER*2     OLDREC,NEWREC,JREC
XC
XC DECLARATIONS
XC
XC
X	COMMON /RMSG/ MLNT,RTEXT(1050)
X	COMMON /CHAN/ INPCH,OUTCH,DBCH
XC
XC CONVERT ALL ARGUMENTS FROM DICTIONARY NUMBERS (IF POSITIVE)
XC TO ABSOLUTE RECORD NUMBERS.
XC
X	X=A					
X	Y=B
X	Z=C
X	IF(X.GT.0) X=RTEXT(X)			
X	IF(Y.GT.0) Y=RTEXT(Y)
X	IF(Z.GT.0) Z=RTEXT(Z)
X	X=IABS(X)				
X	Y=IABS(Y)
X	Z=IABS(Z)
X	IF(X.EQ.0) RETURN			
XC
X	READ(UNIT=DBCH,REC=X) OLDREC,B1
XC
X100	DO 150 I=1,74
X	  X1=and(X,31)+I
X	  B1(I:I)=char(xor(ichar(B1(I:I)),X1))
X150	CONTINUE
XC
X200	IF(Y.EQ.0) GO TO 400			
X	DO 300 I=1,74				
X	  IF(B1(I:I).EQ.'#') GO TO 1000
X300	CONTINUE
XC
X400	DO 500 I=74,1,-1			
X	  IF(B1(I:I).NE.' ') GO TO 600
X500	CONTINUE
XC
XC  600	WRITE(OUTCH,650) (B1(J:J),J=1,I)		
X600	PRINT 650, (B1(J:J),J=1,I)		
X650	FORMAT(1X,74A1)
X	X=X+1					
X	READ(UNIT=DBCH,REC=X) NEWREC,B1
X	IF(OLDREC.EQ.NEWREC) GO TO 100		
X	RETURN					
XC
XC SUBSTITUTION WITH SUBSTITUTABLE AVAILABLE.
XC I IS INDEX OF # IN B1.
XC Y IS NUMBER OF RECORD TO SUBSTITUTE.
XC
XC PROCEDURE:
XC   1) COPY REST OF B1 TO B2
XC   2) READ SUBSTITUTABLE OVER B1
XC   3) RESTORE TAIL OF ORIGINAL B1
XC
XC THE IMPLICIT ASSUMPTION HERE IS THAT THE SUBSTITUTABLE STRING
XC IS VERY SHORT (i.e. MUCH LESS THAN ONE RECORD).
XC
X1000	K2=1					
X	DO 1100 K1=I+1,74			
X	  B2(K2:K2)=B1(K1:K1)
X	  K2=K2+1
X1100	CONTINUE
XC
XC   READ SUBSTITUTE STRING INTO B3, AND DECRYPT IT:
XC
X	READ(UNIT=DBCH,REC=Y) JREC,B3
X	DO 1150 K1=1,74
X	  X1=and(Y,31)+K1
X	  B3(K1:K1)=char(xor(ICHAR(B3(K1:K1)),X1))
X1150	CONTINUE
XC
XC   FILL REMAINDER OF B1 WITH CHARACTERS FROM B3:
XC
X	K2=1
X	DO 1180 K1=I,74
X	  B1(K1:K1)=B3(K2:K2)
X	  K2=K2+1
X1180	CONTINUE
XC
XC   FIND END OF SUBSTITUTE STRING IN B1:
XC
X	DO 1200 J=74,1,-1			
X	  IF(B1(J:J).NE.' ') GO TO 1300
X1200	CONTINUE
XC
XC   PUT TAIL END OF B1 (NOW IN B2) BACK INTO B1 AFTER SUBSTITUTE STRING:
XC
X1300	K1=1					
X	DO 1400 K2=J+1,74			
X	  B1(K2:K2)=B2(K1:K1)
X	  K1=K1+1
X1400	CONTINUE
XC
X	Y=Z					
X	Z=0					
X	GO TO 200				
XC
X	END
X	SUBROUTINE LOAD	
X	IMPLICIT INTEGER (A-Z)
XC
XC	load rtext data 
XC
XC
XC MESSAGE INDEX
XC
X	COMMON /RMSG/ MLNT,RTEXT(1050)
XC
XC
X	rewind 9
XC
XC	 load the data
XC
XC
X	READ(9,130) RTEXT
X130	FORMAT(I8)
X	close(9)
XC
XC
X	return
X	END
END_OF_speak.F
if test 3842 -ne `wc -c <speak.F`; then
    echo shar: \"speak.F\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 6 \(of 14\).
cp /dev/null ark6isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 14 archives.
    rm -f ark[1-9]isdone ark1[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0