home *** CD-ROM | disk | FTP | other *** search
- C VAPPLI- MAIN VERB PROCESSING ROUTINE
- C
- C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
- C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
- C WRITTEN BY R. M. SUPNIK
- C
- C DECLARATIONS
- C
- LOGICAL FUNCTION VAPPLI(RI)
- IMPLICIT INTEGER (A-Z)
- LOGICAL LIT,OBJACT
- LOGICAL QEMPTY,RMDESC,CLOCKD
- LOGICAL QOPEN,EDIBLE,DRKBLE
- LOGICAL TAKE,PUT,DROP,WALK
- LOGICAL QHERE,SVERBS,FINDXT,OAPPLI,F
- C
- C PARSER OUTPUT
- C
- LOGICAL PRSWON
- COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
- C
- C GAME STATE
- C
- LOGICAL TELFLG
- COMMON /PLAY/ WINNER,HERE,TELFLG
- COMMON /STATE/ MOVES,DEATHS,RWSCOR,MXSCOR,MXLOAD,
- 1 LTSHFT,BLOC,MUNGRM,HS,EGSCOR,EGMXSC
- C
- COMMON /STAR/ MBASE,STRBIT
- C
- C ROOMS
- C
- COMMON /ROOMS/ RLNT,RDESC2,RDESC1(200),REXIT(200),
- 1 RACTIO(200),RVAL(200),RFLAG(200)
- INTEGER RRAND(200)
- EQUIVALENCE (RVAL,RRAND)
- C
- COMMON /RFLAG/ RSEEN,RLIGHT,RLAND,RWATER,RAIR,
- 1 RSACRD,RFILL,RMUNG,RBUCK,RHOUSE,RNWALL,REND
- C
- 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
- COMMON /RINDEX/ CPANT,CPOUT,CPUZZ
- C
- C EXITS
- C
- COMMON /XSRCH/ XMIN,XMAX,XDOWN,XUP,
- 1 XNORTH,XSOUTH,XENTER,XEXIT,XEAST,XWEST
- C
- C OBJECTS
- C
- COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220),
- 1 OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220),
- 2 OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220),
- 3 OADV(220),OCAN(220),OREAD(220)
- C
- COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
- 1 NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
- 2 TOOLBT,TURNBT,ONBT
- COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
- 1 WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
- 2 TCHBT,VEHBT,SCHBT
- C
- 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/ WARNI,CSLIT,GCARD,STLDR
- COMMON /OINDEX/ HANDS,WALL,LUNGS,SAILO,AVIAT,TEETH
- COMMON /OINDEX/ ITOBJ,EVERY,VALUA,OPLAY,WNORT,GWATE,MASTER
- C
- C ADVENTURERS
- C
- COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
- 1 AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
- C
- COMMON /AINDEX/ PLAYER,AROBOT,AMASTR
- C
- C VERBS
- C
- 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
- C
- C FUNCTIONS AND DATA
- C
- QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
- EDIBLE(R)=(OFLAG1(R).AND.FOODBT).NE.0
- DRKBLE(R)=(OFLAG1(R).AND.DRNKBT).NE.0
- DATA MXNOP/39/,MXSMP/99/
- C VAPPLI, PAGE 2
- C
- VAPPLI=.TRUE. !ASSUME WINS.
- IF(PRSO.NE.0) ODO2=ODESC2(PRSO) !SET UP DESCRIPTORS.
- IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
- AV=AVEHIC(WINNER)
- RMK=372+RND(6) !REMARK FOR HACK-HACKS.
- C
- IF(RI.EQ.0) GO TO 10 !ZERO IS FALSE.
- IF(RI.LE.MXNOP) RETURN !NOP?
- IF(RI.LE.MXSMP) GO TO 100 !SIMPLE VERB?
- GO TO (18000,20000,
- 2 22000,23000,24000,25000,26000,27000,28000,29000,30000,
- 3 31000,32000,33000,34000,35000,36000, 38000,39000,40000,
- 4 41000,42000,43000,44000,45000,46000,47000,48000,49000,50000,
- 5 51000,52000,53000, 55000,56000, 58000,59000,60000,
- 6 63000,64000,65000,66000, 68000,69000,70000,
- 7 71000,72000,73000,74000, 77000,78000,
- 8 80000,81000,82000,83000,84000,85000,86000,87000,88000),
- 8 (RI-MXSMP)
- CALL BUG(7,RI)
- C
- C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE.
- C
- 10 VAPPLI=.FALSE. !LOSE.
- RETURN
- C
- C SIMPLE VERBS ARE HANDLED EXTERNALLY.
- C
- 100 VAPPLI=SVERBS(RI)
- RETURN
- C VAPPLI, PAGE 3
- C
- C V100-- READ. OUR FIRST REAL VERB.
- C
- 18000 IF(LIT(HERE)) GO TO 18100 !ROOM LIT?
- CALL RSPEAK(356) !NO, CANT READ.
- RETURN
- C
- 18100 IF(PRSI.EQ.0) GO TO 18200 !READ THROUGH OBJ?
- IF((OFLAG1(PRSI).AND.TRANBT).NE.0) GO TO 18200
- CALL RSPSUB(357,ODI2) !NOT TRANSPARENT.
- RETURN
- C
- 18200 IF((OFLAG1(PRSO).AND.READBT).NE.0) GO TO 18300
- CALL RSPSUB(358,ODO2) !NOT READABLE.
- RETURN
- C
- 18300 IF(.NOT.OBJACT(X)) CALL RSPEAK(OREAD(PRSO))
- RETURN
- C
- C V101-- MELT. UNLESS OBJECT HANDLES, JOKE.
- C
- 20000 IF(.NOT.OBJACT(X)) CALL RSPSUB(361,ODO2)
- RETURN
- C
- C V102-- INFLATE. WORKS ONLY WITH BOATS.
- C
- 22000 IF(.NOT.OBJACT(X)) CALL RSPEAK(368) !OBJ HANDLE?
- RETURN
- C
- C V103-- DEFLATE.
- C
- 23000 IF(.NOT.OBJACT(X)) CALL RSPEAK(369) !OBJ HANDLE?
- RETURN
- C VAPPLI, PAGE 4
- C
- C V104-- ALARM. IF SLEEPING, WAKE HIM UP.
- C
- 24000 IF((OFLAG2(PRSO).AND.SLEPBT).EQ.0) GO TO 24100
- VAPPLI=OBJACT(X) !SLEEPING, LET OBJ DO.
- RETURN
- C
- 24100 CALL RSPSUB(370,ODO2) !JOKE.
- RETURN
- C
- C V105-- EXORCISE. OBJECTS HANDLE.
- C
- 25000 F=OBJACT(X) !OBJECTS HANDLE.
- RETURN
- C
- C V106-- PLUG. LET OBJECTS HANDLE.
- C
- 26000 IF(.NOT.OBJACT(X)) CALL RSPEAK(371)
- RETURN
- C
- C V107-- KICK. IF OBJECT IGNORES, JOKE.
- C
- 27000 IF(.NOT.OBJACT(X)) CALL RSPSB2(378,ODO2,RMK)
- RETURN
- C
- C V108-- WAVE. SAME.
- C
- 28000 IF(.NOT.OBJACT(X)) CALL RSPSB2(379,ODO2,RMK)
- RETURN
- C
- C V109,V110-- RAISE, LOWER. SAME.
- C
- 29000 CONTINUE
- 30000 IF(.NOT.OBJACT(X)) CALL RSPSB2(380,ODO2,RMK)
- RETURN
- C
- C V111-- RUB. SAME.
- C
- 31000 IF(.NOT.OBJACT(X)) CALL RSPSB2(381,ODO2,RMK)
- RETURN
- C
- C V112-- PUSH. SAME.
- C
- 32000 IF(.NOT.OBJACT(X)) CALL RSPSB2(382,ODO2,RMK)
- RETURN
- C VAPPLI, PAGE 5
- C
- C V113-- UNTIE. IF OBJECT IGNORES, JOKE.
- C
- 33000 IF(OBJACT(X)) RETURN !OBJECT HANDLE?
- I=383 !NO, NOT TIED.
- IF((OFLAG2(PRSO).AND.TIEBT).EQ.0) I=384 !NOT TIEABLE.
- CALL RSPEAK(I)
- RETURN
- C
- C V114-- TIE. NEVER REALLY WORKS.
- C
- 34000 IF((OFLAG2(PRSO).AND.TIEBT).NE.0) GO TO 34100
- CALL RSPEAK(385) !NOT TIEABLE.
- RETURN
- C
- 34100 IF(.NOT.OBJACT(X)) CALL RSPSUB(386,ODO2) !JOKE.
- RETURN
- C
- C V115-- TIE UP. NEVER REALLY WORKS.
- C
- 35000 IF((OFLAG2(PRSI).AND.TIEBT).NE.0) GO TO 35100
- CALL RSPSUB(387,ODO2) !NOT TIEABLE.
- RETURN
- C
- 35100 I=388 !ASSUME VILLAIN.
- IF((OFLAG2(PRSO).AND.VILLBT).EQ.0) I=389
- CALL RSPSUB(I,ODO2) !JOKE.
- RETURN
- C
- C V116-- TURN. OBJECT MUST HANDLE.
- C
- 36000 IF((OFLAG1(PRSO).AND.TURNBT).NE.0) GO TO 36100
- CALL RSPEAK(390) !NOT TURNABLE.
- RETURN
- C
- 36100 IF((OFLAG1(PRSI).AND.TOOLBT).NE.0) GO TO 36200
- CALL RSPSUB(391,ODI2) !NOT A TOOL.
- RETURN
- C
- 36200 VAPPLI=OBJACT(X) !LET OBJECT HANDLE.
- RETURN
- C
- C V117-- BREATHE. BECOMES INFLATE WITH LUNGS.
- C
- 38000 PRSA=INFLAW
- PRSI=LUNGS
- GO TO 22000 !HANDLE LIKE INFLATE.
- C
- C V118-- KNOCK. MOSTLY JOKE.
- C
- 39000 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- I=394 !JOKE FOR DOOR.
- IF((OFLAG1(PRSO).AND.DOORBT).EQ.0) I=395
- CALL RSPSUB(I,ODO2) !JOKE FOR NONDOORS TOO.
- RETURN
- C
- C V119-- LOOK.
- C
- 40000 IF(PRSO.NE.0) GO TO 41500 !SOMETHING TO LOOK AT?
- VAPPLI=RMDESC(3) !HANDLED BY RMDESC.
- RETURN
- C
- C V120-- EXAMINE.
- C
- 41000 IF(PRSO.NE.0) GO TO 41500 !SOMETHING TO EXAMINE?
- VAPPLI=RMDESC(0) !HANDLED BY RMDESC.
- RETURN
- C
- 41500 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- I=OREAD(PRSO) !GET READING MATERIAL.
- IF(I.NE.0) CALL RSPEAK(I) !OUTPUT IF THERE,
- IF(I.EQ.0) CALL RSPSUB(429,ODO2) !OTHERWISE DEFAULT.
- PRSA=FOOW !DEFUSE ROOM PROCESSORS.
- RETURN
- C
- C V121-- SHAKE. IF HOLLOW OBJECT, SOME ACTION.
- C
- 42000 IF(OBJACT(X)) RETURN !OBJECT HANDLE?
- IF((OFLAG2(PRSO).AND.VILLBT).EQ.0) GO TO 42100
- CALL RSPEAK(371) !JOKE FOR VILLAINS.
- RETURN
- C
- 42100 IF(QEMPTY(PRSO).OR.((OFLAG1(PRSO).AND.TAKEBT).EQ.0))
- 1 GO TO 10 !EMPTY OR NO TAKE? FAILS.
- IF(QOPEN(PRSO)) GO TO 42300 !OPEN? SPILL.
- CALL RSPSUB(396,ODO2) !NO, DESCRIBE NOISE.
- RETURN
- C
- 42300 CALL RSPSUB(397,ODO2) !SPILL THE WORKS.
- DO 42500 I=1,OLNT !SPILL CONTENTS.
- IF(OCAN(I).NE.PRSO) GO TO 42500 !INSIDE?
- OFLAG2(I)=OFLAG2(I).OR.TCHBT !TOUCH OBJECT.
- IF(AV.EQ.0) GO TO 42400 !IN VEHICLE?
- CALL NEWSTA(I,0,0,AV,0) !YES, SPILL IN THERE.
- GO TO 42500
- C
- 42400 CALL NEWSTA(I,0,HERE,0,0) !NO, SPILL ON FLOOR,
- IF(I.EQ.WATER) CALL NEWSTA(I,133,0,0,0) !BUT WATER DISAPPEARS.
- 42500 CONTINUE
- RETURN
- C
- C V122-- MOVE. MOSTLY JOKES.
- C
- 43000 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- I=398 !ASSUME NOT HERE.
- IF(QHERE(PRSO,HERE)) I=399
- CALL RSPSUB(I,ODO2) !JOKE.
- RETURN
- C VAPPLI, PAGE 6
- C
- C V123-- TURN ON.
- C
- 44000 F=LIT(HERE) !RECORD IF LIT.
- IF(OBJACT(X)) GO TO 44300 !OBJ HANDLE?
- IF(((OFLAG1(PRSO).AND.LITEBT).NE.0).AND.
- 1 (OADV(PRSO).EQ.WINNER)) GO TO 44100
- CALL RSPEAK(400) !CANT DO IT.
- RETURN
- C
- 44100 IF((OFLAG1(PRSO).AND.ONBT).EQ.0) GO TO 44200
- CALL RSPEAK(401) !ALREADY ON.
- RETURN
- C
- 44200 OFLAG1(PRSO)=OFLAG1(PRSO).OR.ONBT !TURN IT ON.
- CALL RSPSUB(404,ODO2)
- 44300 IF(.NOT.F .AND.LIT(HERE)) F=RMDESC(0) !ROOM NEWLY LIT.
- RETURN
- C
- C V124-- TURN OFF.
- C
- 45000 IF(OBJACT(X)) GO TO 45300 !OBJ HANDLE?
- IF(((OFLAG1(PRSO).AND.LITEBT).NE.0).AND.
- 1 (OADV(PRSO).EQ.WINNER)) GO TO 45100
- CALL RSPEAK(402) !CANT DO IT.
- RETURN
- C
- 45100 IF((OFLAG1(PRSO).AND.ONBT).NE.0) GO TO 45200
- CALL RSPEAK(403) !ALREADY OFF.
- RETURN
- C
- 45200 OFLAG1(PRSO)=OFLAG1(PRSO).AND. .NOT.ONBT
- CALL RSPSUB(405,ODO2)
- 45300 IF(.NOT.LIT(HERE)) CALL RSPEAK(406) !MAY BE DARK.
- RETURN
- C
- C V125-- OPEN. A FINE MESS.
- C
- 46000 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- IF((OFLAG1(PRSO).AND.CONTBT).NE.0) GO TO 46100
- 46050 CALL RSPSUB(407,ODO2) !NOT OPENABLE.
- RETURN
- C
- 46100 IF(OCAPAC(PRSO).NE.0) GO TO 46200
- CALL RSPSUB(408,ODO2) !NOT OPENABLE.
- RETURN
- C
- 46200 IF(.NOT.QOPEN(PRSO)) GO TO 46225
- CALL RSPEAK(412) !ALREADY OPEN.
- RETURN
- C
- 46225 OFLAG2(PRSO)=OFLAG2(PRSO).OR.OPENBT !OPEN IT.
- IF(((OFLAG1(PRSO).AND.TRANBT).NE.0).OR.QEMPTY(PRSO))
- 1 GO TO 46300
- CALL PRINCO(PRSO,410) !PRINT CONTENTS.
- RETURN
- C
- 46300 CALL RSPEAK(409) !DONE
- RETURN
- C
- C V126-- CLOSE.
- C
- 47000 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- IF((OFLAG1(PRSO).AND.CONTBT).EQ.0) GO TO 46050
- IF(OCAPAC(PRSO).NE.0) GO TO 47100
- CALL RSPSUB(411,ODO2) !NOT CLOSABLE.
- RETURN
- C
- 47100 IF(QOPEN(PRSO)) GO TO 47200 !OPEN?
- CALL RSPEAK(413) !NO, JOKE.
- RETURN
- C
- 47200 OFLAG2(PRSO)=OFLAG2(PRSO).AND. .NOT.OPENBT
- CALL RSPEAK(414) !DONE.
- RETURN
- C VAPPLI, PAGE 7
- C
- C V127-- FIND. BIG MEGILLA.
- C
- 48000 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- I=415 !DEFAULT CASE.
- IF(QHERE(PRSO,HERE)) GO TO 48300 !IN ROOM?
- IF(OADV(PRSO).EQ.WINNER) GO TO 48200 !ON WINNER?
- J=OCAN(PRSO) !DOWN ONE LEVEL.
- IF(J.EQ.0) GO TO 10
- IF((((OFLAG1(J).AND.TRANBT).EQ.0).AND.
- 2 (.NOT.QOPEN(J).OR.((OFLAG1(J).AND.(DOORBT+CONTBT)).EQ.0))))
- 3 GO TO 10 !IF NOT VISIBLE, PUNT.
- I=417 !ASSUME IN ROOM.
- IF(QHERE(J,HERE)) GO TO 48100
- IF(OADV(J).NE.WINNER) GO TO 10 !NOT HERE OR ON PERSON.
- I=418
- 48100 CALL RSPSUB(I,ODESC2(J)) !DESCRIBE FINDINGS.
- RETURN
- C
- 48200 I=416
- 48300 CALL RSPSUB(I,ODO2) !DESCRIBE FINDINGS.
- RETURN
- C
- C V128-- WAIT. RUN CLOCK DEMON.
- C
- 49000 CALL RSPEAK(419) !TIME PASSES.
- DO 49100 I=1,3
- IF(CLOCKD(X)) RETURN
- 49100 CONTINUE
- RETURN
- C
- C V129-- SPIN.
- C V159-- TURN TO.
- C
- 50000 CONTINUE
- 88000 IF(.NOT.OBJACT(X)) CALL RSPEAK(663) !IF NOT OBJ, JOKE.
- RETURN
- C
- C V130-- BOARD. WORKS WITH VEHICLES.
- C
- 51000 IF((OFLAG2(PRSO).AND.VEHBT).NE.0) GO TO 51100
- CALL RSPSUB(421,ODO2) !NOT VEHICLE, JOKE.
- RETURN
- C
- 51100 IF(QHERE(PRSO,HERE)) GO TO 51200 !HERE?
- CALL RSPSUB(420,ODO2) !NO, JOKE.
- RETURN
- C
- 51200 IF(AV.EQ.0) GO TO 51300 !ALREADY GOT ONE?
- CALL RSPSUB(422,ODO2) !YES, JOKE.
- RETURN
- C
- 51300 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- CALL RSPSUB(423,ODO2) !DESCRIBE.
- AVEHIC(WINNER)=PRSO
- IF(WINNER.NE.PLAYER) OCAN(AOBJ(WINNER))=PRSO
- RETURN
- C
- C V131-- DISEMBARK.
- C
- 52000 IF(AV.EQ.PRSO) GO TO 52100 !FROM VEHICLE?
- CALL RSPEAK(424) !NO, JOKE.
- RETURN
- C
- 52100 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- IF((RFLAG(HERE).AND.RLAND).NE.0) GO TO 52200
- CALL RSPEAK(425) !NOT ON LAND.
- RETURN
- C
- 52200 AVEHIC(WINNER)=0
- CALL RSPEAK(426)
- IF(WINNER.NE.PLAYER) CALL NEWSTA(AOBJ(WINNER),0,HERE,0,0)
- RETURN
- C
- C V132-- TAKE. HANDLED EXTERNALLY.
- C
- 53000 VAPPLI=TAKE(.TRUE.)
- RETURN
- C
- C V133-- INVENTORY. PROCESSED EXTERNALLY.
- C
- 55000 CALL INVENT(WINNER)
- RETURN
- C VAPPLI, PAGE 8
- C
- C V134-- FILL. STRANGE DOINGS WITH WATER.
- C
- 56000 IF(PRSI.NE.0) GO TO 56050 !ANY OBJ SPECIFIED?
- IF((RFLAG(HERE).AND.(RWATER+RFILL)).NE.0) GO TO 56025
- CALL RSPEAK(516) !NOTHING TO FILL WITH.
- PRSWON=.FALSE. !YOU LOSE.
- RETURN
- C
- 56025 PRSI=GWATE !USE GLOBAL WATER.
- 56050 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- IF((PRSI.NE.GWATE).AND.(PRSI.NE.WATER))
- 1 CALL RSPSB2(444,ODI2,ODO2) !NO, JOKE.
- RETURN
- C
- C V135,V136-- EAT/DRINK
- C
- 58000 CONTINUE
- 59000 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- IF(PRSO.EQ.GWATE) GO TO 59500 !DRINK GLOBAL WATER?
- IF(.NOT.EDIBLE(PRSO)) GO TO 59400 !EDIBLE?
- IF(OADV(PRSO).EQ.WINNER) GO TO 59200 !YES, ON WINNER?
- 59100 CALL RSPSUB(454,ODO2) !NOT ACCESSIBLE.
- RETURN
- C
- 59200 IF(PRSA.EQ.DRINKW) GO TO 59300 !DRINK FOOD?
- CALL NEWSTA(PRSO,455,0,0,0) !NO, IT DISAPPEARS.
- RETURN
- C
- 59300 CALL RSPEAK(456) !YES, JOKE.
- RETURN
- C
- 59400 IF(.NOT.DRKBLE(PRSO)) GO TO 59600 !DRINKABLE?
- IF(OCAN(PRSO).EQ.0) GO TO 59100 !YES, IN SOMETHING?
- IF(OADV(OCAN(PRSO)).NE.WINNER) GO TO 59100
- IF(QOPEN(OCAN(PRSO))) GO TO 59500 !CONT OPEN?
- CALL RSPEAK(457) !NO, JOKE.
- RETURN
- C
- 59500 CALL NEWSTA(PRSO,458,0,0,0) !GONE.
- RETURN
- C
- 59600 CALL RSPSUB(453,ODO2) !NOT FOOD OR DRINK.
- RETURN
- C
- C V137-- BURN. COMPLICATED.
- C
- 60000 IF((OFLAG1(PRSI).AND.(FLAMBT+LITEBT+ONBT)).NE.
- 1 (FLAMBT+LITEBT+ONBT)) GO TO 60400
- IF(OBJACT(X)) RETURN !OBJ HANDLE?
- IF(OCAN(PRSO).NE.RECEP) GO TO 60050 !BALLOON?
- IF(OAPPLI(OACTIO(BALLO),0)) RETURN !DID IT HANDLE?
- 60050 IF((OFLAG1(PRSO).AND.BURNBT).EQ.0) GO TO 60300
- IF(OADV(PRSO).NE.WINNER) GO TO 60100 !CARRYING IT?
- CALL RSPSUB(459,ODO2)
- CALL JIGSUP(460)
- RETURN
- C
- 60100 J=OCAN(PRSO) !GET CONTAINER.
- IF(QHERE(PRSO,HERE).OR. ((AV.NE.0).AND.(J.EQ.AV)))
- 1 GO TO 60200 !REACHABLE?
- IF(J.EQ.0) GO TO 60150 !INSIDE?
- IF(.NOT.QOPEN(J)) GO TO 60150 !OPEN?
- IF(QHERE(J,HERE).OR.((AV.NE.0).AND.(OCAN(J).EQ.AV)))
- 1 GO TO 60200 !REACHABLE?
- 60150 CALL RSPEAK(461) !CANT REACH IT.
- RETURN
- C
- 60200 CALL RSPSUB(462,ODO2) !BURN IT.
- CALL NEWSTA(PRSO,0,0,0,0)
- RETURN
- C
- 60300 CALL RSPSUB(463,ODO2) !CANT BURN IT.
- RETURN
- C
- 60400 CALL RSPSUB(301,ODI2) !CANT BURN IT WITH THAT.
- RETURN
- C VAPPLI, PAGE 9
- C
- C V138-- MUNG. GO TO COMMON ATTACK CODE.
- C
- 63000 I=466 !CHOOSE PHRASE.
- IF((OFLAG2(PRSO).AND.VILLBT).NE.0) GO TO 66100
- IF(.NOT.OBJACT(X)) CALL RSPSB2(466,ODO2,RMK)
- RETURN
- C
- C V139-- KILL. GO TO COMMON ATTACK CODE.
- C
- 64000 I=467 !CHOOSE PHRASE.
- GO TO 66100
- C
- C V140-- SWING. INVERT OBJECTS, FALL THRU TO ATTACK.
- C
- 65000 J=PRSO !INVERT.
- PRSO=PRSI
- PRSI=J
- J=ODO2
- ODO2=ODI2
- ODI2=J
- PRSA=ATTACW !FOR OBJACT.
- C
- C V141-- ATTACK. FALL THRU TO ATTACK CODE.
- C
- 66000 I=468
- C
- C COMMON MUNG/ATTACK/SWING/KILL CODE.
- C
- 66100 IF(PRSO.NE.0) GO TO 66200 !ANYTHING?
- CALL RSPEAK(469) !NO, JOKE.
- RETURN
- C
- 66200 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- IF((OFLAG2(PRSO).AND.VILLBT).NE.0) GO TO 66300
- IF((OFLAG1(PRSO).AND.VICTBT).EQ.0)
- 1 CALL RSPSUB(470,ODO2) !NOT A VILLAIN.
- RETURN
- C
- 66300 J=471 !ASSUME NO WEAPON.
- IF(PRSI.EQ.0) GO TO 66500
- IF((OFLAG2(PRSI).AND.WEAPBT).EQ.0) GO TO 66400
- MELEE=1 !ASSUME SWORD.
- IF(PRSI.NE.SWORD) MELEE=2 !MUST BE KNIFE.
- I=BLOW(PLAYER,PRSO,MELEE,.TRUE.,0) !STRIKE BLOW.
- RETURN
- C
- 66400 J=472 !NOT A WEAPON.
- 66500 CALL RSPSB2(I,ODO2,J) !JOKE.
- RETURN
- C VAPPLI, PAGE 10
- C
- C V142-- WALK. PROCESSED EXTERNALLY.
- C
- 68000 VAPPLI=WALK(X)
- RETURN
- C
- C V143-- TELL. PROCESSED IN GAME.
- C
- 69000 CALL RSPEAK(603)
- RETURN
- C
- C V144-- PUT. PROCESSED EXTERNALLY.
- C
- 70000 VAPPLI=PUT(.TRUE.)
- RETURN
- C
- C V145,V146,V147,V148-- DROP/GIVE/POUR/THROW
- C
- 71000 CONTINUE
- 72000 CONTINUE
- 73000 CONTINUE
- 74000 VAPPLI=DROP(.FALSE.)
- RETURN
- C
- C V149-- SAVE
- C
- 77000 IF((RFLAG(TSTRS).AND.RSEEN).EQ.0) GO TO 77100
- CALL RSPEAK(828) !NO SAVES IN ENDGAME.
- RETURN
- C
- 77100 CALL SAVEGM
- RETURN
- C
- C V150-- RESTORE
- C
- 78000 IF((RFLAG(TSTRS).AND.RSEEN).EQ.0) GO TO 78100
- CALL RSPEAK(829) !NO RESTORES IN ENDGAME.
- RETURN
- C
- 78100 CALL RSTRGM
- RETURN
- C VAPPLI, PAGE 11
- C
- C V151-- HELLO
- C
- 80000 IF(PRSO.NE.0) GO TO 80100 !ANY OBJ?
- CALL RSPEAK(346+RND(4)) !NO, VANILLA HELLO.
- RETURN
- C
- 80100 IF(PRSO.NE.AVIAT) GO TO 80200 !HELLO AVIATOR?
- CALL RSPEAK(350) !NOTHING HAPPENS.
- RETURN
- C
- 80200 IF(PRSO.NE.SAILO) GO TO 80300 !HELLO SAILOR?
- HS=HS+1 !COUNT.
- I=351 !GIVE NORMAL OR
- IF(MOD(HS,10).EQ.0) I=352 !RANDOM MESSAGE.
- IF(MOD(HS,20).EQ.0) I=353
- CALL RSPEAK(I) !SPEAK UP.
- RETURN
- C
- 80300 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- I=354 !ASSUME VILLAIN.
- IF((OFLAG2(PRSO).AND.(VILLBT+ACTRBT)).EQ.0) I=355
- CALL RSPSUB(I,ODO2) !HELLO THERE!
- RETURN
- C
- C V152-- LOOK INTO
- C
- 81000 IF(OBJACT(X)) RETURN !OBJ HANDLE?
- IF((OFLAG1(PRSO).AND.DOORBT).EQ.0) GO TO 81300 !DOOR?
- IF(.NOT.QOPEN(PRSO)) GO TO 81200 !OPEN?
- CALL RSPSUB(628,ODO2) !OPEN DOOR- UNINTERESTING.
- RETURN
- C
- 81200 CALL RSPSUB(525,ODO2) !CLOSED DOOR- CANT SEE.
- RETURN
- C
- 81300 IF((OFLAG2(PRSO).AND.VEHBT).NE.0) GO TO 81400 !VEHICLE?
- IF(QOPEN(PRSO).OR.((OFLAG1(PRSO).AND.TRANBT).NE.0))
- 1 GO TO 81400 !OPEN OR SEE INSIDE?
- IF((OFLAG1(PRSO).AND.CONTBT).NE.0) GO TO 81200 !CLOSED CONT?
- CALL RSPSUB(630,ODO2) !CANT LOOK INSIDE.
- RETURN
- C
- 81400 IF(QEMPTY(PRSO)) GO TO 81500 !VEH OR SEE IN. EMPTY?
- CALL PRINCO(PRSO,573) !NO, LIST CONTENTS.
- RETURN
- C
- 81500 CALL RSPSUB(629,ODO2) !EMPTY.
- RETURN
- C
- C V153-- LOOK UNDER
- C
- 82000 IF(.NOT.OBJACT(X)) CALL RSPEAK(631) !OBJECT HANDLE?
- RETURN
- C VAPPLI, PAGE 12
- C
- C V154-- PUMP
- C
- 83000 IF((OROOM(PUMP).EQ.HERE).OR.(OADV(PUMP).EQ.WINNER))
- 1 GO TO 83100 !PUMP HERE?
- CALL RSPEAK(632) !NO.
- RETURN
- C
- 83100 PRSI=PUMP !BECOMES INFLATE
- PRSA=INFLAW !X WITH PUMP.
- GO TO 22000 !DONE.
- C
- C V155-- WIND
- C
- 84000 IF(.NOT.OBJACT(X)) CALL RSPSUB(634,ODO2) !OBJ HANDLE?
- RETURN
- C
- C V156-- CLIMB
- C V157-- CLIMB UP
- C V158-- CLIMB DOWN
- C
- 85000 CONTINUE
- 86000 CONTINUE
- 87000 I=XUP !ASSUME UP.
- IF(PRSA.EQ.CLMBDW) I=XDOWN !UNLESS CLIMB DN.
- F=(OFLAG2(PRSO).AND.CLMBBT).NE.0
- IF(F.AND.FINDXT(I,HERE)) GO TO 87500 !ANYTHING TO CLIMB?
- IF(OBJACT(X)) RETURN !OBJ HANDLE?
- I=657
- IF(F) I=524 !VARIETY OF JOKES.
- IF(.NOT.F .AND.((PRSO.EQ.WALL).OR.
- 1 ((PRSO.GE.WNORT).AND.(PRSO.LE.WNORT+3))))
- 2 I=656 !IF WALLS.
- CALL RSPEAK(I) !JOKE.
- RETURN
- C
- 87500 PRSA=WALKW !WALK
- PRSO=I !IN SPECIFIED DIR.
- VAPPLI=WALK(X)
- RETURN
- C
- END
- C CLOCKD- CLOCK DEMON FOR INTERMOVE CLOCK EVENTS
- C
- C DECLARATIONS
- C
- LOGICAL FUNCTION CLOCKD(X)
- IMPLICIT INTEGER (A-Z)
- C
- C CLOCK INTERRUPTS
- C
- LOGICAL*1 CFLAG
- COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25)
- C
- CLOCKD=.FALSE. !ASSUME NO ACTION.
- DO 100 I=1,CLNT
- IF(.NOT.CFLAG(I) .OR.(CTICK(I).EQ.0)) GO TO 100
- IF(CTICK(I).LT.0) GO TO 50 !PERMANENT ENTRY?
- CTICK(I)=CTICK(I)-1
- IF(CTICK(I).NE.0) GO TO 100 !TIMER EXPIRED?
- 50 CLOCKD=.TRUE.
- CALL CEVAPP(CACTIO(I)) !DO ACTION.
- 100 CONTINUE
- RETURN
- C
- END
-