C VAPPLI- MAIN VERB PROCESSING ROUTINE
C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
C WRITTEN BY R. M. SUPNIK
LOGICAL FUNCTION VAPPLI(RI)
LOGICAL QEMPTY,RMDESC,CLOCKD
LOGICAL QOPEN,EDIBLE,DRKBLE
LOGICAL TAKE,PUT,DROP,WALK
LOGICAL QHERE,SVERBS,FINDXT,OAPPLI,F
COMMON /STAR/ MBASE,STRBIT
QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
EDIBLE(R)=and(OFLAG1(R),FOODBT).NE.0
DRKBLE(R)=and(OFLAG1(R),DRNKBT).NE.0
IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
5 IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
C !REMARK FOR HACK-HACKS.
IF(RI.LE.MXSMP) GO TO 100
& 22000,23000,24000,25000,26000,27000,28000,29000,30000,
& 31000,32000,33000,34000,35000,36000, 38000,39000,40000,
& 41000,42000,43000,44000,45000,46000,47000,48000,49000,50000,
& 51000,52000,53000, 55000,56000, 58000,59000,60000,
& 63000,64000,65000,66000, 68000,69000,70000,
& 71000,72000,73000,74000, 77000,78000,
& 80000,81000,82000,83000,84000,85000,86000,87000,88000),
C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE.
C SIMPLE VERBS ARE HANDLED EXTERNALLY.
C V100-- READ. OUR FIRST REAL VERB.
18000 IF(LIT(HERE)) GO TO 18100
18100 IF(PRSI.EQ.0) GO TO 18200
IF(and(OFLAG1(PRSI),TRANBT).NE.0) GO TO 18200
18200 IF(and(OFLAG1(PRSO),READBT).NE.0) GO TO 18300
18300 IF(.NOT.OBJACT(X)) CALL RSPEAK(OREAD(PRSO))
C V101-- MELT. UNLESS OBJECT HANDLES, JOKE.
20000 IF(.NOT.OBJACT(X)) CALL RSPSUB(361,ODO2)
C V102-- INFLATE. WORKS ONLY WITH BOATS.
22000 IF(.NOT.OBJACT(X)) CALL RSPEAK(368)
23000 IF(.NOT.OBJACT(X)) CALL RSPEAK(369)
C V104-- ALARM. IF SLEEPING, WAKE HIM UP.
24000 IF(and(OFLAG2(PRSO),SLEPBT).EQ.0) GO TO 24100
24100 CALL RSPSUB(370,ODO2)
C V105-- EXORCISE. OBJECTS HANDLE.
C V106-- PLUG. LET OBJECTS HANDLE.
26000 IF(.NOT.OBJACT(X)) CALL RSPEAK(371)
C V107-- KICK. IF OBJECT IGNORES, JOKE.
27000 IF(.NOT.OBJACT(X)) CALL RSPSB2(378,ODO2,RMK)
28000 IF(.NOT.OBJACT(X)) CALL RSPSB2(379,ODO2,RMK)
C V109,V110-- RAISE, LOWER. SAME.
30000 IF(.NOT.OBJACT(X)) CALL RSPSB2(380,ODO2,RMK)
31000 IF(.NOT.OBJACT(X)) CALL RSPSB2(381,ODO2,RMK)
32000 IF(.NOT.OBJACT(X)) CALL RSPSB2(382,ODO2,RMK)
C V113-- UNTIE. IF OBJECT IGNORES, JOKE.
33000 IF(OBJACT(X)) RETURN
IF(and(OFLAG2(PRSO),TIEBT).EQ.0) I=384
C V114-- TIE. NEVER REALLY WORKS.
34000 IF(and(OFLAG2(PRSO),TIEBT).NE.0) GO TO 34100
34100 IF(.NOT.OBJACT(X)) CALL RSPSUB(386,ODO2)
C V115-- TIE UP. NEVER REALLY WORKS.
35000 IF(and(OFLAG2(PRSI),TIEBT).NE.0) GO TO 35100
IF(and(OFLAG2(PRSO),VILLBT).EQ.0) I=389
C V116-- TURN. OBJECT MUST HANDLE.
36000 IF(and(OFLAG1(PRSO),TURNBT).NE.0) GO TO 36100
36100 IF(and(OFLAG1(PRSI),TOOLBT).NE.0) GO TO 36200
C V117-- BREATHE. BECOMES INFLATE WITH LUNGS.
C V118-- KNOCK. MOSTLY JOKE.
39000 IF(OBJACT(X)) RETURN
IF(and(OFLAG1(PRSO),DOORBT).EQ.0) I=395
C !JOKE FOR NONDOORS TOO.
40000 IF(PRSO.NE.0) GO TO 41500
41000 IF(PRSO.NE.0) GO TO 41500
41500 IF(OBJACT(X)) RETURN
IF(I.NE.0) CALL RSPEAK(I)
IF(I.EQ.0) CALL RSPSUB(429,ODO2)
C !DEFUSE ROOM PROCESSORS.
C V121-- SHAKE. IF HOLLOW OBJECT, SOME ACTION.
42000 IF(OBJACT(X)) RETURN
IF(and(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 42100
42100 IF(QEMPTY(PRSO).OR.(and(OFLAG1(PRSO),TAKEBT).EQ.0))
IF(QOPEN(PRSO)) GO TO 42300
42300 CALL RSPSUB(397,ODO2)
IF(OCAN(I).NE.PRSO) GO TO 42500
OFLAG2(I)=or(OFLAG2(I),TCHBT)
42400 CALL NEWSTA(I,0,HERE,0,0)
IF(I.EQ.WATER) CALL NEWSTA(I,133,0,0,0)
C V122-- MOVE. MOSTLY JOKES.
43000 IF(OBJACT(X)) RETURN
IF(QHERE(PRSO,HERE)) I=399
IF(OBJACT(X)) GO TO 44300
IF((and(OFLAG1(PRSO),LITEBT).NE.0).AND.
& (OADV(PRSO).EQ.WINNER)) GO TO 44100
44100 IF(and(OFLAG1(PRSO),ONBT).EQ.0) GO TO 44200
44200 OFLAG1(PRSO)=or(OFLAG1(PRSO),ONBT)
44300 IF(.NOT.F .AND.LIT(HERE)) F=RMDESC(0)
45000 IF(OBJACT(X)) GO TO 45300
IF((and(OFLAG1(PRSO),LITEBT).NE.0).AND.
& (OADV(PRSO).EQ.WINNER)) GO TO 45100
45100 IF(and(OFLAG1(PRSO),ONBT).NE.0) GO TO 45200
45200 OFLAG1(PRSO)=and(OFLAG1(PRSO), not(ONBT))
45300 IF(.NOT.LIT(HERE)) CALL RSPEAK(406)
C V125-- OPEN. A FINE MESS.
46000 IF(OBJACT(X)) RETURN
IF(and(OFLAG1(PRSO),CONTBT).NE.0) GO TO 46100
46050 CALL RSPSUB(407,ODO2)
46100 IF(OCAPAC(PRSO).NE.0) GO TO 46200
46200 IF(.NOT.QOPEN(PRSO)) GO TO 46225
46225 OFLAG2(PRSO)=or(OFLAG2(PRSO),OPENBT)
IF((and(OFLAG1(PRSO),TRANBT).NE.0).OR.QEMPTY(PRSO))
47000 IF(OBJACT(X)) RETURN
IF(and(OFLAG1(PRSO),CONTBT).EQ.0) GO TO 46050
IF(OCAPAC(PRSO).NE.0) GO TO 47100
47100 IF(QOPEN(PRSO)) GO TO 47200
47200 OFLAG2(PRSO)=and(OFLAG2(PRSO), not(OPENBT))
C V127-- FIND. BIG MEGILLA.
48000 IF(OBJACT(X)) RETURN
IF(QHERE(PRSO,HERE)) GO TO 48300
IF(OADV(PRSO).EQ.WINNER) GO TO 48200
IF(((and(OFLAG1(J),TRANBT).EQ.0).AND.
& (.NOT.QOPEN(J).OR.(and(OFLAG1(J),(DOORBT+CONTBT)).EQ.0))))
IF(QHERE(J,HERE)) GO TO 48100
IF(OADV(J).NE.WINNER) GO TO 10
C !NOT HERE OR ON PERSON.
48100 CALL RSPSUB(I,ODESC2(J))
48300 CALL RSPSUB(I,ODO2)
C V128-- WAIT. RUN CLOCK DEMON.
88000 IF(.NOT.OBJACT(X)) CALL RSPEAK(663)
C V130-- BOARD. WORKS WITH VEHICLES.
51000 IF(and(OFLAG2(PRSO),VEHBT).NE.0) GO TO 51100
51100 IF(QHERE(PRSO,HERE)) GO TO 51200
51200 IF(AV.EQ.0) GO TO 51300
51300 IF(OBJACT(X)) RETURN
IF(WINNER.NE.PLAYER) OCAN(AOBJ(WINNER))=PRSO
52000 IF(AV.EQ.PRSO) GO TO 52100
52100 IF(OBJACT(X)) RETURN
IF(and(RFLAG(HERE),RLAND).NE.0) GO TO 52200
IF(WINNER.NE.PLAYER) CALL NEWSTA(AOBJ(WINNER),0,HERE,0,0)
C V132-- TAKE. HANDLED EXTERNALLY.
53000 VAPPLI=TAKE(.TRUE.)
C V133-- INVENTORY. PROCESSED EXTERNALLY.
55000 CALL INVENT(WINNER)
C V134-- FILL. STRANGE DOINGS WITH WATER.
56000 IF(PRSI.NE.0) GO TO 56050
IF(and(RFLAG(HERE),(RWATER+RFILL)).NE.0) GO TO 56025
56050 IF(OBJACT(X)) RETURN
IF((PRSI.NE.GWATE).AND.(PRSI.NE.WATER))
& CALL RSPSB2(444,ODI2,ODO2)
59000 IF(OBJACT(X)) RETURN
IF(PRSO.EQ.GWATE) GO TO 59500
IF(.NOT.EDIBLE(PRSO)) GO TO 59400
IF(OADV(PRSO).EQ.WINNER) GO TO 59200
59100 CALL RSPSUB(454,ODO2)
59200 IF(PRSA.EQ.DRINKW) GO TO 59300
CALL NEWSTA(PRSO,455,0,0,0)
59400 IF(.NOT.DRKBLE(PRSO)) GO TO 59600
IF(OCAN(PRSO).EQ.0) GO TO 59100
IF(OADV(OCAN(PRSO)).NE.WINNER) GO TO 59100
IF(QOPEN(OCAN(PRSO))) GO TO 59500
59500 CALL NEWSTA(PRSO,458,0,0,0)
59600 CALL RSPSUB(453,ODO2)
C V137-- BURN. COMPLICATED.
60000 IF(and(OFLAG1(PRSI),(FLAMBT+LITEBT+ONBT)).NE.
& (FLAMBT+LITEBT+ONBT)) GO TO 60400
IF(OCAN(PRSO).NE.RECEP) GO TO 60050
IF(OAPPLI(OACTIO(BALLO),0)) RETURN
60050 IF(and(OFLAG1(PRSO),BURNBT).EQ.0) GO TO 60300
IF(OADV(PRSO).NE.WINNER) GO TO 60100
IF(QHERE(PRSO,HERE).OR. ((AV.NE.0).AND.(J.EQ.AV)))
IF(.NOT.QOPEN(J)) GO TO 60150
IF(QHERE(J,HERE).OR.((AV.NE.0).AND.(OCAN(J).EQ.AV)))
60200 CALL RSPSUB(462,ODO2)
CALL NEWSTA(PRSO,0,0,0,0)
60300 CALL RSPSUB(463,ODO2)
60400 CALL RSPSUB(301,ODI2)
C !CANT BURN IT WITH THAT.
C V138-- MUNG. GO TO COMMON ATTACK CODE.
IF(and(OFLAG2(PRSO),VILLBT).NE.0) GO TO 66100
IF(.NOT.OBJACT(X)) CALL RSPSB2(466,ODO2,RMK)
C V139-- KILL. GO TO COMMON ATTACK CODE.
C V140-- SWING. INVERT OBJECTS, FALL THRU TO ATTACK.
C V141-- ATTACK. FALL THRU TO ATTACK CODE.
C COMMON MUNG/ATTACK/SWING/KILL CODE.
66100 IF(PRSO.NE.0) GO TO 66200
66200 IF(OBJACT(X)) RETURN
IF(and(OFLAG2(PRSO),VILLBT).NE.0) GO TO 66300
IF(and(OFLAG1(PRSO),VICTBT).EQ.0)
IF(PRSI.EQ.0) GO TO 66500
IF(and(OFLAG2(PRSI),WEAPBT).EQ.0) GO TO 66400
IF(PRSI.NE.SWORD) MELEE=2
I=BLOW(PLAYER,PRSO,MELEE,.TRUE.,0)
66500 CALL RSPSB2(I,ODO2,J)
C V142-- WALK. PROCESSED EXTERNALLY.
C V143-- TELL. PROCESSED IN GAME.
C V144-- PUT. PROCESSED EXTERNALLY.
C V145,V146,V147,V148-- DROP/GIVE/POUR/THROW
74000 VAPPLI=DROP(.FALSE.)
77000 IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 77100
78000 IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 78100
C !NO RESTORES IN ENDGAME.
80000 IF(PRSO.NE.0) GO TO 80100
80100 IF(PRSO.NE.AVIAT) GO TO 80200
80200 IF(PRSO.NE.SAILO) GO TO 80300
IF(MOD(HS,10).EQ.0) I=352
IF(MOD(HS,20).EQ.0) I=353
80300 IF(OBJACT(X)) RETURN
IF(and(OFLAG2(PRSO),(VILLBT+ACTRBT)).EQ.0) I=355
81000 IF(OBJACT(X)) RETURN
IF(and(OFLAG1(PRSO),DOORBT).EQ.0) GO TO 81300
IF(.NOT.QOPEN(PRSO)) GO TO 81200
C !OPEN DOOR- UNINTERESTING.
81200 CALL RSPSUB(525,ODO2)
C !CLOSED DOOR- CANT SEE.
81300 IF(and(OFLAG2(PRSO),VEHBT).NE.0) GO TO 81400
IF(QOPEN(PRSO).OR.(and(OFLAG1(PRSO),TRANBT).NE.0))
IF(and(OFLAG1(PRSO),CONTBT).NE.0) GO TO 81200
81400 IF(QEMPTY(PRSO)) GO TO 81500
81500 CALL RSPSUB(629,ODO2)
82000 IF(.NOT.OBJACT(X)) CALL RSPEAK(631)
83000 IF((OROOM(PUMP).EQ.HERE).OR.(OADV(PUMP).EQ.WINNER))
84000 IF(.NOT.OBJACT(X)) CALL RSPSUB(634,ODO2)
IF(PRSA.EQ.CLMBDW) I=XDOWN
F=(and(OFLAG2(PRSO),CLMBBT)).NE.0
IF(F.AND.FINDXT(I,HERE)) GO TO 87500
IF(.NOT.F .AND.((PRSO.EQ.WALL).OR.
& ((PRSO.GE.WNORT).AND.(PRSO.LE.WNORT+3))))
C CLOCKD- CLOCK DEMON FOR INTERMOVE CLOCK EVENTS
LOGICAL FUNCTION CLOCKD(X)
IF(.NOT.CFLAG(I) .OR.(CTICK(I).EQ.0)) GO TO 100
IF(CTICK(I).LT.0) GO TO 50
IF(CTICK(I).NE.0) GO TO 100