# 4000--	PREPOSITION
#
4000	IF(PREP.NE.0) GO TO 4500		#ALREADY HAVE ONE?
	PREP=PVOC(J+2)			#NO, GET INDEX.
	ADJ=0					#NO ADJECTIVE.
#D	IF(DFLAG) TYPE 30,J
#D30	FORMAT(' SPARSE- PREP AT ',I6)
	GO TO 1000
#
4500	IF(VBFLAG) CALL RSPEAK(616)		#YES, GAG AND LOSE.
	RETURN
#
# 5000--	ADJECTIVE
#
5000	ADJ=J					#SAVE ADJECTIVE.
	J=ONAME.AND.OFLAG
#D	IF(DFLAG) TYPE 40,ADJ,J
#D40	FORMAT(' SPARSE- ADJ AT ',I6,' ORPHAN= ',I6)
	IF((J.NE.0).AND.(I.GE.LLNT)) GO TO 600
	GO TO 1000
#
# 6000--	UNIDENTIFIABLE OBJECT (INDEX INTO OVOC IS J)
#
6000	IF(OBJ.LT.0) GO TO 6100			#IF LT, AMBIGUOUS.
	I=579					#NOT HERE OR
	IF(LIT(HERE)) I=618			#NOT LIT.
	IF(VBFLAG) CALL RSPEAK(I)
	RETURN					#LOSE.
#
6100	IF(OBJ.NE.-10000) GO TO 6200		#INSIDE VEHICLE?
	IF(VBFLAG) CALL RSPSUB(620,ODESC2(AVEHIC(WINNER)))
	RETURN
#
6200	IF(VBFLAG) CALL RSPEAK(619)		#CANT DISTINGUISH.
	IF(ACT.EQ.0) ACT=OFLAG.AND.OACT	#IF NO ACT, GET ORPHAN.
	CALL ORPHAN(-1,ACT,O1,PREP,J)		#ORPHAN THE WORLD.
	RETURN
#
# 7000--	TOO MANY OBJECTS.
#
7000	IF(VBFLAG) CALL RSPEAK(617)
	RETURN
#
# 8000--	RANDOMNESS FOR "OF" WORDS
#
8000	IF(OBJVEC(PPTR).EQ.OBJ) GO TO 700	#IGNORE IF OK.
	IF(VBFLAG) CALL RSPEAK(601)
	RETURN
#
# 9000--	NO ACTION, PUNT
#
9000	IF(O1.EQ.0) GO TO 10000			#ANY DIRECT OBJECT?
	IF(VBFLAG) CALL RSPSUB(621,ODESC2(O1))	#WHAT TO DO?
	CALL ORPHAN(-1,0,O1,0,0)
	RETURN
#
# 10000--	TOTAL CHOMP
#
10000	IF(VBFLAG) CALL RSPEAK(622)		#HUH?
	RETURN
#
# 11000--	ORPHAN PREPOSITION.  CONDITIONS ARE
#		O1.NE.0, O2=0, PREP=0, ACT=OACT
#
11000	IF(OSLOT.NE.0) GO TO 11500		#ORPHAN OBJECT?
	P1=OPREP				#NO, JUST USE PREP.
	GO TO 1750
#
11500	O2=O1					#YES, USE AS DIRECT OBJ.
	P2=OPREP
	O1=OSLOT
	P1=0
	GO TO 1750
#
# 12000--	TRUE HANGING PREPOSITION.
#		ORPHAN FOR LATER.
#
12000	CALL ORPHAN(-1,ACT,0,PREP,0)		#ORPHAN PREP.
	GO TO 1750
#
#  SPECIAL ENTRY TO INIT RADIX-50 TEXT (CALLED FROM DINIT)
#
	ENTRY SPINIT
#
	CALL R50CNV(R50WAL,1)
	CALL R50CNV(BVOC,20)
	CALL R50CNV(PVOC,45)
	CALL R50CNV(DVOC,75)
	CALL R50CNV(AVOC,400)
	CALL R50CNV(VVOC,900)
	CALL R50CNV(OVOC,1050)
	RETURN
#
	END

# GETOBJ--	FIND OBJ DESCRIBED BY ADJ, NAME PAIR
#
# DECLARATIONS
#
# THIS ROUTINE DETAILS ON BIT 3 OF PRSFLG
#
	INTEGER FUNCTION GETOBJ(OIDX,AIDX,SPCOBJ)
	IMPLICIT INTEGER(A-Z)
	LOGICAL THISIT,GHERE,LIT,CHOMP,DFLAG
#
	COMMON /OBJFLG/ VABIT,VRBIT,VTBIT,VCBIT,VEBIT,VFBIT,VPMASK
#
# GAME STATE
#
	LOGICAL TELFLG
	COMMON /PLAY/ WINNER,HERE,TELFLG
#
# MISCELLANEOUS VARIABLES
#
	COMMON /STAR/ MBASE,STRBIT
	COMMON /DEBUG/ DBGFLG,PRSFLG
#
# OBJECTS
#
	COMMON /OBJCTS/ OLNT,ODESC1(250),ODESC2(250),ODESCO(250),
		OACTIO(250),OFLAG1(250),OFLAG2(250),OFVAL(250),
		OTVAL(250),OSIZE(250),OCAPAC(250),OROOM(250),
			OADV(250),OCAN(250),OREAD(250)
#
	COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
		NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
		TOOLBT,TURNBT,ONBT
	COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
		WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
		TCHBT,VEHBT,SCHBT
#
# ADVENTURERS
#
	COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
		AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
#
# VOCABULARIES
#
	COMMON /OBJVOC/ OVOC(1050)

# GETOBJ, PAGE 2
#
#D	DFLAG=AND(PRSFLG,o'10').NE.0
	CHOMP=.FALSE.
	AV=AVEHIC(WINNER)
	OBJ=0					#ASSUME DARK.
	IF(.NOT.LIT(HERE)) GO TO 200		#LIT?
#
	OBJ=SCHLST(OIDX,AIDX,HERE,0,0,SPCOBJ)	#SEARCH ROOM.
#D	IF(DFLAG) TYPE 10,OBJ
#D10	FORMAT(' SCHLST- ROOM SCH ',I6)
	IF(OBJ) 1000,200,100			#TEST RESULT.
100	IF((AV.EQ.0).OR.(AV.EQ.OBJ).OR.
		(AND(OFLAG2(OBJ),FINDBT).NE.0)) GO TO 200
	IF(OCAN(OBJ).EQ.AV) GO TO 200		#TEST IF REACHABLE.
	CHOMP=.TRUE.				#PROBABLY NOT.
#
200	IF(AV.EQ.0) GO TO 400			#IN VEHICLE?
	NOBJ=SCHLST(OIDX,AIDX,0,AV,0,SPCOBJ)	#SEARCH VEHICLE.
#D	IF(DFLAG) TYPE 20,NOBJ
#D20	FORMAT(' SCHLST- VEH SCH  ',I6)
	IF(NOBJ) 1100,400,300			#TEST RESULT.
300	CHOMP=.FALSE.				#REACHABLE.
	IF(OBJ.EQ.NOBJ) GO TO 400		#SAME AS BEFORE?
	IF(OBJ.NE.0) NOBJ=-NOBJ			#AMB RESULT?
	OBJ=NOBJ
#
400	NOBJ=SCHLST(OIDX,AIDX,0,0,WINNER,SPCOBJ)	#SEARCH ADVENTURER.
#D	IF(DFLAG) TYPE 30,NOBJ
#D30	FORMAT(' SCHLST- ADV SCH  ',I6)
	IF(NOBJ) 1100,600,500			#TEST RESULT
500	IF(OBJ.NE.0) NOBJ=-NOBJ			#AMB RESULT?
1100	OBJ=NOBJ				#RETURN NEW OBJECT.
600	IF(CHOMP) OBJ=-10000			#UNREACHABLE.
1000	GETOBJ=OBJ
#
	IF(GETOBJ.NE.0) GO TO 1500		#GOT SOMETHING?
	DO I=STRBIT+1,OLNT {			#NO, SEARCH GLOBALS.
	  IF(.NOT.THISIT(OIDX,AIDX,I,SPCOBJ)) GO TO 1200
	  IF(.NOT.GHERE(I,HERE)) NEXT		#CAN IT BE HERE?
	  IF(GETOBJ.NE.0) GETOBJ=-I		#AMB MATCH?
	  IF(GETOBJ.EQ.0) GETOBJ=I
	  }
#
1500	CONTINUE				#END OF SEARCH.
#D	IF(DFLAG) TYPE 40,GETOBJ
#D40	FORMAT(' SCHLST- RESULT   ',I6)
	RETURN
	END

# SCHLST--	SEARCH FOR OBJECT
#
# DECLARATIONS
#
	INTEGER FUNCTION SCHLST(OIDX,AIDX,RM,CN,AD,SPCOBJ)
	IMPLICIT INTEGER(A-Z)
	LOGICAL THISIT,QHERE,NOTRAN,NOVIS
#
	COMMON /STAR/ MBASE,STRBIT
#
# OBJECTS
#
	COMMON /OBJCTS/ OLNT,ODESC1(250),ODESC2(250),ODESCO(250),
		OACTIO(250),OFLAG1(250),OFLAG2(250),OFVAL(250),
		OTVAL(250),OSIZE(250),OCAPAC(250),OROOM(250),
			OADV(250),OCAN(250),OREAD(250)
#
	COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
		NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
		TOOLBT,TURNBT,ONBT
	COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
		WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
		TCHBT,VEHBT,SCHBT
#
# FUNCTIONS AND DATA
#
	NOTRAN(O)=
		(AND(OFLAG1(O),TRANBT).EQ.0).AND.(AND(OFLAG2(O),OPENBT).EQ.0)
	NOVIS(O)=(AND(OFLAG1(O),VISIBT).EQ.0)
#
	SCHLST=0					#NO RESULT.
	DO I=1,OLNT {				#SEARCH OBJECTS.
	  IF(NOVIS(I).OR.
		(((RM.EQ.0).OR.(.NOT.QHERE(I,RM))).AND.
		 ((CN.EQ.0).OR.(OCAN(I).NE.CN)).AND.
			 ((AD.EQ.0).OR.(OADV(I).NE.AD)))) NEXT
	  IF(.NOT.THISIT(OIDX,AIDX,I,SPCOBJ)) GO TO 200
	  IF(SCHLST.NE.0) GO TO 2000		#GOT ONE ALREADY?
	  SCHLST=I					#NO.
#
# IF OPEN OR TRANSPARENT, SEARCH THE OBJECT ITSELF.
#
200	  IF(NOTRAN(I)) NEXT
#
# SEARCH IS CONDUCTED IN REVERSE.  ALL OBJECTS ARE CHECKED TO
# SEE IF THEY ARE AT SOME LEVEL OF CONTAINMENT INSIDE OBJECT 'I'.
# IF THEY ARE AT LEVEL 1, OR IF ALL LINKS IN THE CONTAINMENT
# CHAIN ARE OPEN, VISIBLE, AND HAVE SEARCHME SET, THEY CAN QUALIFY
# AS A POTENTIAL MATCH.
#
	  DO J=1,OLNT {				#SEARCH OBJECTS.
	    IF(NOVIS(J).OR. (.NOT.THISIT(OIDX,AIDX,J,SPCOBJ))) {
		NEXT				#VISIBLE & MATCH?
		}
	    X=OCAN(J)				#GET CONTAINER.
300	    IF(X.EQ.I) GO TO 400		#INSIDE TARGET?
	    IF(X.EQ.0) NEXT			#INSIDE ANYTHING?
	    IF(NOVIS(X).OR.NOTRAN(X).OR.
		(AND(OFLAG2(X),SCHBT).EQ.0)) NEXT
	    X=OCAN(X)				#GO ANOTHER LEVEL.
	    GO TO 300
#
400	    IF(SCHLST.NE.0) GO TO 2000		#ALREADY GOT ONE?
	    SCHLST=J				#NO.
	    }
#
	  }
	RETURN
#
2000	SCHLST=-SCHLST				#AMB RETURN.
	RETURN
#
	END

# THISIT--	VALIDATE OBJECT VS DESCRIPTION
#
# DECLARATIONS
#
	LOGICAL FUNCTION THISIT(OIDX,AIDX,OBJ,SPCOBJ)
	IMPLICIT INTEGER(A-Z)
	LOGICAL NOTEST
#
# VOCABULARIES
#
	COMMON /OBJVOC/ OVOC(1050)
	COMMON /ADJVOC/ AVOC(400)
#
# FUNCTIONS AND DATA
#
	NOTEST(O)=(O.LE.0).OR.(O.GE.R50MIN)
	DATA R50MIN/o'3100'/
#
	THISIT=.FALSE.				#ASSUME NO MATCH.
	IF((SPCOBJ.NE.0).AND.(OBJ.EQ.SPCOBJ)) GO TO 500
#
# CHECK FOR OBJECT NAMES
#
	I=OIDX+1
100	I=I+1
	IF(NOTEST(OVOC(I))) RETURN		#IF DONE, LOSE.
	IF(OVOC(I).NE.OBJ) GO TO 100		#IF FAIL, CONT.
#
	IF(AIDX.EQ.0) GO TO 500			#ANY ADJ?
	I=AIDX+1
200	I=I+1
	IF(NOTEST(AVOC(I))) RETURN		#IF DONE, LOSE.
	IF(AVOC(I).NE.OBJ) GO TO 200		#IF FAIL, CONT.
#
500	THISIT=.TRUE.
	RETURN
	END

# SYNMCH--	SYNTAX MATCHER
#
# DECLARATIONS
#
# THIS ROUTINE DETAILS ON BIT 4 OF PRSFLG
#
	LOGICAL FUNCTION SYNMCH
	IMPLICIT INTEGER(A-Z)
	LOGICAL SYNEQL,TAKEIT,DFLAG
#
# PARSER OUTPUT
#
	LOGICAL PRSWON
	COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
#
	COMMON /DEBUG/ DBGFLG,PRSFLG
#
	COMMON /ORPHS/ OFLAG,OACT,OSLOT,OPREP,ONAME
	COMMON /PV/ ACT,O1,O2,P1,P2
	COMMON /SYNTAX/VFLAG,DOBJ,DFL1,DFL2,DFW1,DFW2,
		IOBJ,IFL1,IFL2,IFW1,IFW2
	COMMON /VRBVOC/ VVOC(900)
	COMMON /SYNFLG/ SDIR,SIND,SSTD,SFLIP,SDRIV,SVMASK
	COMMON /OBJFLG/ VABIT,VRBIT,VTBIT,VCBIT,VEBIT,VFBIT,VPMASK
	DATA R50MIN/o'3100'/
#
	SYNMCH=.FALSE.
#D	DFLAG=AND(PRSFLG,o'20').NE.0
	J=ACT					#SET UP PTR TO SYNTAX.
	DRIVE=0					#NO DEFAULT.
	DFORCE=0				#NO FORCED DEFAULT.
	QPREP=AND(OFLAG,OPREP)			#VALID ORPHAN PREP FLAG.
100	J=J+2					#FIND START OF SYNTAX.
	IF((VVOC(J).LE.0).OR.(VVOC(J).GE.R50MIN)) GO TO 100
	LIMIT=J+VVOC(J)+1			#COMPUTE LIMIT.
	J=J+1					#ADVANCE TO NEXT.
#
200	CALL UNPACK(J,NEWJ)			#UNPACK SYNTAX.
#D	IF(DFLAG) TYPE 60,O1,P1,DOBJ,DFL1,DFL2
#D60	FORMAT(' SYNMCH INPUTS TO SYNEQL- ',5I7)
	SPREP=AND(DOBJ,VPMASK)			#SAVE EXPECTED PREP.
	IF(.NOT.SYNEQL(P1,O1,DOBJ,DFL1,DFL2)) GO TO 1000
#D	IF(DFLAG) TYPE 60,O2,P2,IOBJ,IFL1,IFL2
	SPREP=AND(IOBJ,VPMASK)			#SAVE EXPECTED PREP.
	IF(SYNEQL(P2,O2,IOBJ,IFL1,IFL2)) GO TO 6000
#
# SYNTAX MATCH FAILS, TRY NEXT ONE.
#
	IF(O2) 3000,500,3000			#IF O2=0, SET DFLT.
1000	IF(O1) 3000,500,3000			#IF O1=0, SET DFLT.
500	IF((QPREP.EQ.0).OR.(QPREP.EQ.SPREP)) DFORCE=J	#IF PREP MCH.
	IF(AND(VFLAG,SDRIV).NE.0) DRIVE=J	#IF DRIVER, RECORD.
3000	J=NEWJ
	IF(J.LT.LIMIT) GO TO 200		#MORE TO DO?

# SYNMCH, PAGE 2
#
# MATCH HAS FAILED.  IF DEFAULT SYNTAX EXISTS, TRY TO SNARF
# ORPHANS OR GWIMS, OR MAKE NEW ORPHANS.
#
#D	IF(DFLAG) TYPE 20,DRIVE,DFORCE
#D20	FORMAT(' SYNMCH, DRIVE=',2I6)
	IF(DRIVE.EQ.0) DRIVE=DFORCE		#NO DRIVER? USE FORCE.
	IF(DRIVE.EQ.0) GO TO 10000		#ANY DRIVER?
	CALL UNPACK(DRIVE,DFORCE)		#UNPACK DFLT SYNTAX.
#
# TRY TO FILL DIRECT OBJECT SLOT IF THAT WAS THE PROBLEM.
#
	IF((AND(VFLAG,SDIR).EQ.0).OR.(O1.NE.0)) GO TO 4000
#
# FIRST TRY TO SNARF ORPHAN OBJECT.
#
	O1=AND(OFLAG,OSLOT)
	IF(O1.EQ.0) GO TO 3500			#ANY ORPHAN?
	IF(SYNEQL(P1,O1,DOBJ,DFL1,DFL2)) GO TO 4000
#
# ORPHAN FAILS, TRY GWIM.
#
3500	O1=GWIM(DOBJ,DFW1,DFW2)			#GET GWIM.
#D	IF(DFLAG) TYPE 30,O1
#D30	FORMAT(' SYNMCH- DO GWIM= ',I6)
	IF(O1.GT.0) GO TO 4000		#TEST RESULT.
	CALL ORPHAN(-1,ACT,0,AND(DOBJ,VPMASK),0)	#FAILS, ORPHAN.
	CALL RSPEAK(623)
	RETURN
#
# TRY TO FILL INDIRECT OBJECT SLOT IF THAT WAS THE PROBLEM.
#
4000	IF((AND(VFLAG,SIND).EQ.0).OR.(O2.NE.0)) GO TO 6000
	O2=GWIM(IOBJ,IFW1,IFW2)			#GWIM.
#D	IF(DFLAG) TYPE 40,O2
#D40	FORMAT(' SYNMCH- IO GWIM= ',I6)
	IF(O2.GT.0) GO TO 6000
	IF(O1.EQ.0) O1=AND(OFLAG,OSLOT)
	CALL ORPHAN(-1,ACT,O1,AND(DOBJ,VPMASK),0)
	CALL RSPEAK(624)
	RETURN
#
# TOTAL CHOMP
#
10000	CALL RSPEAK(601)			#CANT DO ANYTHING.
	RETURN

# SYNMCH, PAGE 3
#
# NOW TRY TO TAKE INDIVIDUAL OBJECTS AND
# IN GENERAL CLEAN UP THE PARSE VECTOR.
#
6000	IF(AND(VFLAG,SFLIP).EQ.0) GO TO 5000	#FLIP?
	J=O1					#YES.
	O1=O2
	O2=J
#
5000	PRSA=AND(VFLAG,SVMASK)			#GET VERB.
	PRSO=O1					#GET DIR OBJ.
	PRSI=O2					#GET IND OBJ.
	IF(.NOT.TAKEIT(PRSO,DOBJ)) RETURN	#TRY TAKE.
	IF(.NOT.TAKEIT(PRSI,IOBJ)) RETURN	#TRY TAKE.
	SYNMCH=.TRUE.
#D	IF(DFLAG) TYPE 50,SYNMCH,PRSA,PRSO,PRSI,ACT,O1,O2
#D50	FORMAT(' SYNMCH- RESULTS ',L1,6I7)
	RETURN
#
	END

# UNPACK-	UNPACK SYNTAX SPECIFICATION, ADV POINTER
#
# DECLARATIONS
#
	SUBROUTINE UNPACK(OLDJ,J)
	IMPLICIT INTEGER(A-Z)
#
	COMMON /VRBVOC/ VVOC(900)
#
	COMMON /SYNFLG/ SDIR,SIND,SSTD,SFLIP,SDRIV,SVMASK
	COMMON /OBJFLG/ VABIT,VRBIT,VTBIT,VCBIT,VEBIT,VFBIT,VPMASK
	COMMON /SYNTAX/ VFLAG,DOBJ,DFL1,DFL2,DFW1,DFW2,
		IOBJ,IFL1,IFL2,IFW1,IFW2
	INTEGER SYN(11)
	EQUIVALENCE (SYN(1),VFLAG)
#
	DO I=1,11 {				#CLEAR SYNTAX.
	  SYN(I)=0
	  }
#
	VFLAG=VVOC(OLDJ)
	J=OLDJ+1
	IF(AND(VFLAG,SDIR).EQ.0) RETURN		#DIR OBJECT?
	DFL1=-1					#ASSUME STD.
	DFL2=-1
	IF(AND(VFLAG,SSTD).EQ.0) GO TO 100	#STD OBJECT?
	DFW1=-1					#YES.
	DFW2=-1
	DOBJ=VABIT+VRBIT+VFBIT
	GO TO 200
#
100	DOBJ=VVOC(J)				#NOT STD.
	DFW1=VVOC(J+1)
	DFW2=VVOC(J+2)
	J=J+3
	IF(AND(DOBJ,VEBIT).EQ.0) GO TO 200	#VBIT = VFWIM?
	DFL1=DFW1				#YES.
	DFL2=DFW2
#
200	IF(AND(VFLAG,SIND).EQ.0) RETURN	#IND OBJECT?
	IFL1=-1					#ASSUME STD.
	IFL2=-1
	IOBJ=VVOC(J)
	IFW1=VVOC(J+1)
	IFW2=VVOC(J+2)
	J=J+3
	IF(AND(IOBJ,VEBIT).EQ.0) RETURN	#VBIT = VFWIM?
	IFL1=IFW1				#YES.
	IFL2=IFW2
	RETURN
#
	END

# SYNEQL-	TEST FOR SYNTAX EQUALITY
#
# DECLARATIONS
#
	LOGICAL FUNCTION SYNEQL(PREP,OBJ,SPREP,SFL1,SFL2)
	IMPLICIT INTEGER(A-Z)
#
# OBJECTS
#
	COMMON /OBJCTS/ OLNT,ODESC1(250),ODESC2(250),ODESCO(250),
		OACTIO(250),OFLAG1(250),OFLAG2(250),OFVAL(250),
		OTVAL(250),OSIZE(250),OCAPAC(250),OROOM(250),
			OADV(250),OCAN(250),OREAD(250)
#
	COMMON /OBJFLG/ VABIT,VRBIT,VTBIT,VCBIT,VEBIT,VFBIT,VPMASK
#
	IF(OBJ.EQ.0) GO TO 100			#ANY OBJECT?
	SYNEQL=(PREP.EQ.AND(SPREP,VPMASK)).AND.((AND(SFL1,OFLAG1(OBJ)).OR.AND(SFL2,OFLAG2(OBJ))).NE.0)
	RETURN
#
100	SYNEQL=(PREP.EQ.0).AND.(SFL1.EQ.0).AND.(SFL2.EQ.0)
	RETURN
#
	END

# TAKEIT-	PARSER BASED TAKE OF OBJECT
#
# DECLARATIONS
#
	LOGICAL FUNCTION TAKEIT(OBJ,SFLAG)
	IMPLICIT INTEGER(A-Z)
#
	COMMON /OBJFLG/ VABIT,VRBIT,VTBIT,VCBIT,VEBIT,VFBIT,VPMASK
	COMMON /STAR/ MBASE,STRBIT
#
# GAME STATE
#
	LOGICAL TELFLG
	COMMON /PLAY/ WINNER,HERE,TELFLG
	COMMON /STATE/ MOVES,DEATHS,RWSCOR,MXSCOR,MXLOAD,
		LTSHFT,BLOC,MUNGRM,HS,EGSCOR,EGMXSC
#
# OBJECTS
#
	COMMON /OBJCTS/ OLNT,ODESC1(250),ODESC2(250),ODESCO(250),
		OACTIO(250),OFLAG1(250),OFLAG2(250),OFVAL(250),
		OTVAL(250),OSIZE(250),OCAPAC(250),OROOM(250),
			OADV(250),OCAN(250),OREAD(250)
#
	COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
		NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
		TOOLBT,TURNBT,ONBT
	COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
		WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
		TCHBT,VEHBT,SCHBT
#
# ADVENTURERS
#
	COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
		AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)

# TAKEIT, PAGE 2
#
	TAKEIT=.FALSE.				#ASSUME LOSES.
	IF((OBJ.EQ.0).OR.(OBJ.GT.STRBIT)) GO TO 4000	#NULL/STARS WIN.
	ODO2=ODESC2(OBJ)			#GET DESC.
	X=OCAN(OBJ)				#GET CONTAINER.
	IF((X.EQ.0).OR.(AND(SFLAG,VFBIT).EQ.0)) GO TO 500
	IF(AND(OFLAG2(X),OPENBT).NE.0) GO TO 500
	CALL RSPSUB(566,ODO2)			#CANT REACH.
	RETURN
#
500	IF(AND(SFLAG,VRBIT).EQ.0) GO TO 1000	#SHLD BE IN ROOM?
	IF(AND(SFLAG,VTBIT).EQ.0) GO TO 2000	#CAN BE TAKEN?
#
# SHOULD BE IN ROOM (VRBIT NE 0) AND CAN BE TAKEN (VTBIT NE 0)
#
	IF(SCHLST(0,0,HERE,0,0,OBJ).LE.0) GO TO 4000	#IF NOT, OK.
#
# ITS IN THE ROOM AND CAN BE TAKEN
#
	IF(AND(OFLAG1(OBJ),TAKEBT).NE.0) GO TO 3000
#
# NOT TAKEABLE.  IF WE CARE, FAIL.
#
	IF(AND(SFLAG,VCBIT).EQ.0) GO TO 4000	#IF NO CARE, RETURN.
	CALL RSPSUB(445,ODO2)
	RETURN
#
# 1000--	IT SHOULD NOT BE IN THE ROOM.
# 2000--	IT CANT BE TAKEN.
#
2000	IF(AND(SFLAG,VCBIT).EQ.0) GO TO 4000	#IF NO CARE, RETURN
1000	IF(SCHLST(0,0,HERE,0,0,OBJ).LE.0) GO TO 4000
	CALL RSPSUB(665,ODO2)
	RETURN

# TAKEIT, PAGE 3
#
# OBJECT IS IN THE ROOM, CAN BE TAKEN BY THE PARSER,
# AND IS TAKEABLE IN GENERAL.  IT IS NOT A STAR.
# IF IT IS INSIDE SOMETHING, THE CONTAINER IS OPEN.
# THE FOLLOWING CODE IS LIFTED FROM SUBROUTINE TAKE.
#
3000	IF(OBJ.NE.AVEHIC(WINNER)) GO TO 3500	#TAKE VEHICLE?
	CALL RSPEAK(672)
	RETURN
#
3500	IF(((X.NE.0).AND.(OADV(X).EQ.WINNER)).OR.
		((WEIGHT(0,OBJ,WINNER)+OSIZE(OBJ)).LE.MXLOAD))
		GO TO 3700
	CALL RSPEAK(558)			#TOO BIG.
	RETURN
#
3700	CALL NEWSTA(OBJ,559,0,0,WINNER)		#DO TAKE.
	OFLAG2(OBJ)=OFLAG2(OBJ).OR.TCHBT	#TOUCHED.
	CALL SCRUPD(OFVAL(OBJ))
	OFVAL(OBJ)=0
#
4000	TAKEIT=.TRUE.				#SUCCESS.
	RETURN
#
	END

# GWIM- GET WHAT I MEAN IN AMBIGOUS SITUATIONS
#
# DECLARATIONS
#
	INTEGER FUNCTION GWIM(SFLAG,SFW1,SFW2)
	IMPLICIT INTEGER(A-Z)
	LOGICAL TAKEIT,NOCARE
#
	COMMON /OBJFLG/ VABIT,VRBIT,VTBIT,VCBIT,VEBIT,VFBIT,VPMASK
	COMMON /STAR/ MBASE,STRBIT
#
# GAME STATE
#
	LOGICAL TELFLG
	COMMON /PLAY/ WINNER,HERE,TELFLG
#
# OBJECTS
#
	COMMON /OBJCTS/ OLNT,ODESC1(250),ODESC2(250),ODESCO(250),
		OACTIO(250),OFLAG1(250),OFLAG2(250),OFVAL(250),
		OTVAL(250),OSIZE(250),OCAPAC(250),OROOM(250),
			OADV(250),OCAN(250),OREAD(250)
#
	COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
		NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
		TOOLBT,TURNBT,ONBT
	COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
		WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
		TCHBT,VEHBT,SCHBT
#
# ADVENTURERS
#
	COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
		AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)

# GWIM, PAGE 2
#
	GWIM=-1					#ASSUME LOSE.
	AV=AVEHIC(WINNER)
	NOBJ=0
	NOCARE=AND(SFLAG,VCBIT).EQ.0
#
# FIRST SEARCH ADVENTURER
#
	IF(AND(SFLAG,VABIT).NE.0)
		NOBJ=FWIM(SFW1,SFW2,0,0,WINNER,NOCARE)
	IF(AND(SFLAG,VRBIT).NE.0) GO TO 100
50	GWIM=NOBJ
	RETURN
#
# ALSO SEARCH ROOM
#
100	ROBJ=FWIM(SFW1,SFW2,HERE,0,0,NOCARE)
	IF(ROBJ) 500,50,200			#TEST RESULT.
#
# ROBJ > 0
#
200	IF((AV.EQ.0).OR.(ROBJ.EQ.AV).OR.
		(AND(OFLAG2(ROBJ),FINDBT).NE.0)) GO TO 300
	IF(OCAN(ROBJ).NE.AV) GO TO 50		#UNREACHABLE? TRY NOBJ
300	IF(NOBJ.NE.0) RETURN			#IF AMBIGUOUS, RETURN.
	IF(.NOT.TAKEIT(ROBJ,SFLAG)) RETURN	#IF UNTAKEABLE, RETURN
	GWIM=ROBJ
500	RETURN
#
	END

# CLOCKD- CLOCK DEMON FOR INTERMOVE CLOCK EVENTS
#
# DECLARATIONS
#
	LOGICAL FUNCTION CLOCKD(X)
	IMPLICIT INTEGER (A-Z)
#
# CLOCK INTERRUPTS
#
	LOGICAL CFLAG
	COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25)
#
	CLOCKD=.FALSE.			#ASSUME NO ACTION.
	DO I=1,CLNT {
	  IF(.NOT.CFLAG(I) .OR.(CTICK(I).EQ.0)) NEXT
	  IF(CTICK(I).LT.0) GO TO 50		#PERMANENT ENTRY?
	  CTICK(I)=CTICK(I)-1
	  IF(CTICK(I).NE.0) NEXT		#TIMER EXPIRED?
50	  CLOCKD=.TRUE.
	  CALL CEVAPP(CACTIO(I))		#DO ACTION.
	  }
	RETURN
#
	END
# OAPPLI- OBJECT SPECIAL ACTION ROUTINES
#
# DECLARATIONS
#
	LOGICAL FUNCTION OAPPLI(RI,ARG)
	IMPLICIT INTEGER (A-Z)
	LOGICAL SOBJS,NOBJS
	LOGICAL QOPEN,QON,LIT
	LOGICAL MOVETO,RMINFO,CLOCKD
	LOGICAL THIEFP,CYCLOP,TROLLP,BALLOP,LIGHTP
	LOGICAL QEMPTY,QHERE,F,OPNCLS
#
# PARSER OUTPUT
#
	LOGICAL PRSWON
	COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
#
# GAME STATE
#
	LOGICAL TELFLG
	COMMON /PLAY/ WINNER,HERE,TELFLG
	COMMON /STATE/ MOVES,DEATHS,RWSCOR,MXSCOR,MXLOAD,
		LTSHFT,BLOC,MUNGRM,HS,EGSCOR,EGMXSC
#
	COMMON /BATS/ BATDRP(9)
#
# ROOMS
#
	COMMON /ROOMS/ RLNT,RDESC2,RDESC1(215),REXIT(215),
		RACTIO(215),RVAL(215),RFLAG(215)
	INTEGER RRAND(215)
	EQUIVALENCE (RVAL,RRAND)
#
	COMMON /RFLAG/ RSEEN,RLIGHT,RLAND,RWATER,RAIR,
		RSACRD,RFILL,RMUNG,RBUCK,RHOUSE,RNWALL,REND
#
	COMMON /RINDEX/ WHOUS,LROOM,CELLA
	COMMON /RINDEX/ MTROL,MAZE1	
	COMMON /RINDEX/ MGRAT,MAZ15	
	COMMON /RINDEX/ FORE1,FORE3,CLEAR,RESER
	COMMON /RINDEX/ STREA,EGYPT,ECHOR
	COMMON /RINDEX/ TSHAF	
	COMMON /RINDEX/ BSHAF,MMACH,DOME,MTORC
	COMMON /RINDEX/ CAROU	
	COMMON /RINDEX/ RIDDL,LLD2,TEMP1,TEMP2,MAINT
	COMMON /RINDEX/ BLROO,TREAS,RIVR1,RIVR2,RIVR3,MCYCL
	COMMON /RINDEX/ RIVR4,RIVR5,FCHMP,FALLS,MBARR
	COMMON /RINDEX/ MRAIN,POG,VLBOT,VAIR1,VAIR2,VAIR3,VAIR4
	COMMON /RINDEX/ LEDG2,LEDG3,LEDG4,MSAFE,CAGER
	COMMON /RINDEX/ CAGED,TWELL,BWELL,ALICE,ALISM,ALITR
	COMMON /RINDEX/ MTREE,BKENT,BKVW,BKTWI,BKVAU,BKBOX
	COMMON /RINDEX/ CRYPT,TSTRS,MRANT,MREYE
	COMMON /RINDEX/ MRA,MRB,MRC,MRG,MRD,FDOOR
	COMMON /RINDEX/ MRAE,MRCE,MRCW,MRGE,MRGW,MRDW,INMIR
	COMMON /RINDEX/ SCORR,NCORR,PARAP,CELL,PCELL,NCELL
#
# OBJECTS
#
	COMMON /OBJCTS/ OLNT,ODESC1(250),ODESC2(250),ODESCO(250),
		OACTIO(250),OFLAG1(250),OFLAG2(250),OFVAL(250),
		OTVAL(250),OSIZE(250),OCAPAC(250),OROOM(250),
			OADV(250),OCAN(250),OREAD(250)
#
	COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
		NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
		TOOLBT,TURNBT,ONBT
	COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
		WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
		TCHBT,VEHBT,SCHBT
#
	COMMON /OINDEX/ GARLI,FOOD,GUNK,COAL,MACHI,DIAMO,TCASE,BOTTL
	COMMON /OINDEX/ WATER,ROPE,KNIFE,SWORD,LAMP,BLAMP,RUG
	COMMON /OINDEX/	LEAVE,TROLL,AXE
	COMMON /OINDEX/ RKNIF,KEYS,ICE,BAR
	COMMON /OINDEX/ COFFI,TORCH,TBASK,FBASK,IRBOX
	COMMON /OINDEX/ GHOST,TRUNK,BELL,BOOK,CANDL
	COMMON /OINDEX/ MATCH,TUBE,PUTTY,WRENC,SCREW,CYCLO,CHALI
	COMMON /OINDEX/ THIEF,STILL,WINDO,GRATE,DOOR
	COMMON /OINDEX/ HPOLE,LEAK,RBUTT,RAILI
	COMMON /OINDEX/ POT,STATU,IBOAT,DBOAT,PUMP,RBOAT
	COMMON /OINDEX/ STICK,BUOY,SHOVE,BALLO,RECEP,GUANO
	COMMON /OINDEX/ BROPE,HOOK1,HOOK2,SAFE,SSLOT,BRICK,FUSE
	COMMON /OINDEX/ GNOME,BLABE,DBALL,TOMB
	COMMON /OINDEX/ LCASE,CAGE,RCAGE,SPHER,SQBUT
	COMMON /OINDEX/ FLASK,POOL,SAFFR,BUCKE,ECAKE,ORICE,RDICE,BLICE
	COMMON /OINDEX/ ROBOT,FTREE,BILLS,PORTR,SCOL,ZGNOM
	COMMON /OINDEX/ EGG,BEGG,BAUBL,CANAR,BCANA
	COMMON /OINDEX/ YLWAL,RDWAL,PINDR,RBEAM
	COMMON /OINDEX/ ODOOR,QDOOR,CDOOR,NUM1,NUM8
	COMMON /OINDEX/ HANDS,WALL,LUNGS,SAILO,AVIAT,TEETH
	COMMON /OINDEX/ ITOBJ,EVERY,VALUA,OPLAY,WNORT,GWATE,MASTER
#
# CLOCK INTERRUPTS
#
	LOGICAL CFLAG
	COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25)
#
	COMMON /CINDEX/ CEVCUR,CEVMNT,CEVLNT,CEVMAT,CEVCND,
		CEVBAL,CEVBRN,CEVFUS,CEVLED,CEVSAF,CEVVLG,
		CEVGNO,CEVBUC,CEVSPH,CEVEGH,
			CEVFOR,CEVSCL,CEVZGI,CEVZGO,CEVSTE,
		CEVMRS,CEVPIN,CEVINQ,CEVFOL

#
# ADVENTURERS
#
	COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
		AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
#
	COMMON /AINDEX/ PLAYER,AROBOT,AMASTR
#
# VERBS
#
	COMMON /VINDEX/ CINTW,DEADXW,FRSTQW,INXW,OUTXW
	COMMON /VINDEX/ WALKIW,FIGHTW,FOOW
	COMMON /VINDEX/ MELTW,READW,INFLAW,DEFLAW,ALARMW,EXORCW
	COMMON /VINDEX/ PLUGW,KICKW,WAVEW,RAISEW,LOWERW,RUBW
	COMMON /VINDEX/ PUSHW,UNTIEW,TIEW,TIEUPW,TURNW,BREATW
	COMMON /VINDEX/ KNOCKW,LOOKW,EXAMIW,SHAKEW,MOVEW,TRNONW,TRNOFW
	COMMON /VINDEX/ OPENW,CLOSEW,FINDW,WAITW,SPINW,BOARDW,UNBOAW,TAKEW
	COMMON /VINDEX/ INVENW,FILLW,EATW,DRINKW,BURNW
	COMMON /VINDEX/ MUNGW,KILLW,ATTACW,SWINGW
	COMMON /VINDEX/ WALKW,TELLW,PUTW,DROPW,GIVEW,POURW,THROWW
	COMMON /VINDEX/ DIGW,LEAPW,STAYW,FOLLOW
	COMMON /VINDEX/ HELLOW,LOOKIW,LOOKUW,PUMPW,WINDW
	COMMON /VINDEX/ CLMBW,CLMBUW,CLMBDW,TRNTOW
#
# FLAGS
#
	LOGICAL TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF
	LOGICAL DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF
	LOGICAL MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF
	LOGICAL EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF
	LOGICAL GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF
	LOGICAL GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF
	LOGICAL MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF
	LOGICAL FOLLWF,SPELLF,sprf
	COMMON /FINDEX/ TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF,
		DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF,
		MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF,
			EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF,
		GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF,
		GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF,
		MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF,
		follwf,spellf,sprf(6)
	COMMON /FINDEX/ BTIEF,BINFF
	COMMON /FINDEX/ RVMNT,RVCLR,RVCYC,RVSND,RVGUA
	COMMON /FINDEX/ ORRUG,ORCAND,ORMTCH,ORLAMP
	COMMON /FINDEX/ MDIR,MLOC,POLEUF
	COMMON /FINDEX/ QUESNO,NQATT,CORRCT
	COMMON /FINDEX/ LCELL,PNUMB,ACELL,DCELL
#
# FUNCTIONS AND DATA
#
	QOPEN(R)=AND(OFLAG2(R),OPENBT).NE.0
	QON(R)=AND(OFLAG1(R),ONBT).NE.0
	DATA MXSMP/99/

# OAPPLI, PAGE 2
#
	IF(RI.EQ.0) GO TO 10			#ZERO IS FALSE APP.
	IF(RI.LE.MXSMP) GO TO 100		#SIMPLE OBJECT?
	IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
	IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
	AV=AVEHIC(WINNER)
	FLOBTS=FLAMBT+LITEBT+ONBT
	OAPPLI=.TRUE.
#
	GO TO (2000,5000,10000,11000,12000,15000,18000,
		19000,20000,22000,25000,26000,32000,35000,39000,40000,
		45000,47000,48000,49000,50000,51000,52000,54000,55000,
		 56000,57000,58000,59000,60000,61000),
			(RI-MXSMP)
	CALL BUG(6,RI)
#
# RETURN HERE TO DECLARE FALSE RESULT
#
10	OAPPLI=.FALSE.
	RETURN
#
# SIMPLE OBJECTS, PROCESSED EXTERNALLY.
#
100	IF(RI.LT.32) OAPPLI=SOBJS(RI,ARG)
	IF(RI.GE.32) OAPPLI=NOBJS(RI,ARG)
	RETURN

# OAPPLI, PAGE 3
#
# O100--	MACHINE FUNCTION
#
2000	IF(HERE.NE.MMACH) GO TO 10		#NOT HERE? F
	OAPPLI=OPNCLS(MACHI,123,124)		#HANDLE OPN/CLS.
	RETURN
#
# O101--	WATER FUNCTION
#
5000	IF(PRSA.NE.FILLW) GO TO 5050		#FILL IS
	PRSA=PUTW				#MADE INTO
	I=PRSI
	PRSI=PRSO
	PRSO=I					#PUT WATER IN OBJ.
	I=ODI2
	ODI2=ODO2
	ODO2=I
5050	IF(PRSA.NE.THROWW) GO TO 5100		#THROW?
	CALL NEWSTA(PRSO,132,0,0,0)		#EVAPORATES.
	RETURN
#
5100	IF((PRSA.NE.DROPW).AND.(PRSA.NE.POURW).AND.(PRSA.NE.GIVEW))
		GO TO 5200			#DROP?
	IF(AV.NE.0) GO TO 5150			#INTO VEHICLE?
	CALL NEWSTA(PRSO,133,0,0,0)		#EVAPORATES.
	RETURN
#
5150	CALL NEWSTA(WATER,0,0,AV,0)		#INTO VEHICLE.
	CALL RSPSUB(296,ODESC2(AV))		#DESCRIBE.
	RETURN
#
5200	IF((PRSA.NE.TAKEW).AND.(PRSA.NE.PUTW)) GO TO 10
	IF((AV.EQ.PRSI).AND.(AV.NE.0)) GO TO 5150
	IF((PRSI.NE.0).AND.(PRSI.NE.BOTTL)) GO TO 5300
	IF(OADV(BOTTL).NE.WINNER) GO TO 5400	#GOT BOTTLE?
	I=612
	IF(.NOT.QOPEN(BOTTL)) GO TO 5250	#BOTTLE OPEN?
	I=613
	IF(.NOT.QEMPTY(BOTTL)) GO TO 5250	#BOTTLE EMPTY?
	I=614
	CALL NEWSTA(WATER,0,0,BOTTL,0)		#WATER INTO BOTTLE
5250	CALL RSPEAK(I)				#DESCRIBE.
	RETURN
#
5300	CALL RSPSUB(297,ODI2)			#WATER WONT GO
	CALL NEWSTA(PRSO,0,0,0,0)		#EVAPORATES.
	RETURN
#
# BOTTLE NOT ON WINNER.
#
5400	IF((OCAN(WATER).EQ.BOTTL).AND.(PRSA.EQ.TAKEW).AND.
		(PRSI.EQ.0)) GO TO 5500		#TAKE W IN B?
	CALL RSPEAK(615)			#NO, LOSE.
	RETURN
#
5500	IF(QHERE(BOTTL,HERE)) GO TO 5600	#BOTTLE HERE?
	CALL RSPSUB(566,ODESC2(BOTTL))		#NO, CANT TAKE IT.
	RETURN
#
5600	CALL NEWSTA(BOTTL,559,0,0,WINNER)	#FINALLY, TAKE BOTTLE.
	RETURN

# OAPPLI, PAGE 4
#
# O102--	LEAF PILE
#
10000	IF(PRSA.NE.BURNW) GO TO 10500		#BURN?
	IF(OROOM(PRSO).EQ.0) GO TO 10100	#WAS HE CARRYING?
	CALL NEWSTA(PRSO,158,0,0,0)		#NO, BURN IT.
	RETURN
#
10100	CALL NEWSTA(PRSO,0,HERE,0,0)		#DROP LEAVES.
	CALL JIGSUP(159)			#BURN HIM.
	RETURN
#
10500	IF(PRSA.NE.MOVEW) GO TO 10600		#MOVE?
	CALL RSPEAK(2)				#DONE.
	RETURN
#
10600	IF((PRSA.NE.LOOKUW).OR.(RVCLR.NE.0)) GO TO 10
	CALL RSPEAK(344)			#LOOK UNDER?
	RETURN
#
# O103--	TROLL, DONE EXTERNALLY.
#
11000	OAPPLI=TROLLP(ARG)			#TROLL PROCESSOR.
	RETURN
#
# O104--	RUSTY KNIFE.
#
12000	IF(PRSA.NE.TAKEW) GO TO 12100		#TAKE?
	IF(OADV(SWORD).EQ.WINNER) CALL RSPEAK(160)	#PULSE SWORD.
	GO TO 10
#
12100	IF((((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW)).OR.
		(PRSI.NE.RKNIF)).AND.
		(((PRSA.NE.SWINGW).AND.(PRSA.NE.THROWW)).OR.
			(PRSO.NE.RKNIF))) GO TO 10
	CALL NEWSTA(RKNIF,0,0,0,0)		#KILL KNIFE.
	CALL JIGSUP(161)			#KILL HIM.
	RETURN

# OAPPLI, PAGE 5
#
# O105--	GLACIER
#
15000	IF(PRSA.NE.THROWW) GO TO 15500	#THROW?
	IF(PRSO.NE.TORCH) GO TO 15400		#TORCH?
	CALL NEWSTA(ICE,169,0,0,0)		#MELT ICE.
	ODESC1(TORCH)=174			#MUNG TORCH.
	ODESC2(TORCH)=173
	OFLAG1(TORCH)=AND(OFLAG1(TORCH),NOT(FLOBTS))
	CALL NEWSTA(TORCH,0,STREA,0,0)		#MOVE TORCH.
	GLACRF=.TRUE.				#GLACIER GONE.
	IF(.NOT.LIT(HERE)) CALL RSPEAK(170)	#IN DARK?
	RETURN
#
15400	CALL RSPEAK(171)			#JOKE IF NOT TORCH.
