home *** CD-ROM | disk | FTP | other *** search
- C SVERBS- SIMPLE VERBS PROCESSOR
- C ALL VERBS IN THIS ROUTINE MUST BE INDEPENDANT
- C OF OBJECT ACTIONS
- 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 SVERBS(RI)
- IMPLICIT INTEGER (A-Z)
- LOGICAL MOVETO,YESNO
- LOGICAL RMDESC
- LOGICAL QOPEN
- LOGICAL FINDXT,QHERE,F
- INTEGER JOKES(25)
- LOGICAL*1 ANSSTR(78)
- LOGICAL*1 P1(6),P2(6),CH(6)
- INTEGER ANSWER(28)
- 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
- C SCREEN OF LIGHT
- C
- COMMON /SCREEN/ FROMDR,SCOLRM,SCOLAC
- COMMON /SCREEN/ SCOLDR(8),SCOLWL(12)
- C
- C MISCELLANEOUS VARIABLES
- C
- LOGICAL*1 INBUF
- COMMON /INPUT/ INLNT,INBUF(78)
- COMMON /VERS/ VMAJ,VMIN,VEDIT
- COMMON /CHAN/ INPCH,OUTCH,DBCH
- 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 /EXITS/ XLNT,TRAVEL(900)
- C
- COMMON /CURXT/ XTYPE,XROOM1,XSTRNG,XACTIO,XOBJ
- EQUIVALENCE (XFLAG,XOBJ)
- C
- COMMON /XPARS/ XRMASK,XDMASK,XFMASK,XFSHFT,XASHFT,
- 1 XELNT(4),XNORM,XNO,XCOND,XDOOR,XLFLAG
- 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 CLOCK INTERRUPTS
- C
- LOGICAL*1 CFLAG
- COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25)
- C
- COMMON /CINDEX/ CEVCUR,CEVMNT,CEVLNT,CEVMAT,CEVCND,
- 1 CEVBAL,CEVBRN,CEVFUS,CEVLED,CEVSAF,CEVVLG,
- 2 CEVGNO,CEVBUC,CEVSPH,CEVEGH,
- 3 CEVFOR,CEVSCL,CEVZGI,CEVZGO,CEVSTE,
- 5 CEVMRS,CEVPIN,CEVINQ,CEVFOL
-
- 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 FLAGS
- C
- LOGICAL*1 FLAGS(46)
- EQUIVALENCE (FLAGS(1),TROLLF)
- LOGICAL*1 TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF
- LOGICAL*1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF
- LOGICAL*1 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF
- LOGICAL*1 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF
- LOGICAL*1 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF
- LOGICAL*1 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF
- LOGICAL*1 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF
- LOGICAL*1 FOLLWF,SPELLF,CPOUTF,CPUSHF
- COMMON /FINDEX/ TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF,
- 1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF,
- 2 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF,
- 3 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF,
- 4 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF,
- 5 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF,
- 6 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF,
- 7 FOLLWF,SPELLF,CPOUTF,CPUSHF
- 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,CPHERE
- C
- C FUNCTIONS AND DATA
- C
- QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
- DATA MXNOP/39/,MXJOKE/64/
- DATA JOKES/4,5,3,304,305,306,307,308,309,310,311,312,
- 1 313,5314,5319,324,325,883,884,120,120,0,0,0,0/
- DATA ANSWER/0,6,1,6,2,5,3,5,4,3,4,6,4,6,4,5,
- 1 5,5,5,4,5,6,6,10,7,4,7,6/
- DATA ANSSTR/'T','E','M','P','L','E',
- 1 'F','O','R','E','S','T',
- 2 '3','0','0','0','3',
- 3 'F','L','A','S','K',
- 4 'R','U','B',
- 5 'F','O','N','D','L','E',
- 6 'C','A','R','R','E','S',
- 7 'T','O','U','C','H',
- 8 'B','O','N','E','S',
- 9 'B','O','D','Y',
- 1 'S','K','E','L','E','T',
- 2 'R','U','S','T','Y','K','N','I','F','E',
- 3 'N','O','N','E',
- 4 'N','O','W','H','E','R',0/
- C SVERBS, PAGE 2
- C
- SVERBS=.TRUE. !ASSUME WINS.
- IF(PRSO.NE.0) ODO2=ODESC2(PRSO) !SET UP DESCRIPTORS.
- IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
- C
- IF(RI.EQ.0) CALL BUG(7,RI) !ZERO IS VERBOTEN.
- IF(RI.LE.MXNOP) RETURN !NOP?
- IF(RI.LE.MXJOKE) GO TO 100 !JOKE?
- GO TO (65000,66000,67000,68000,69000,
- 1 1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,
- 2 11000,12000,13000,14000,15000,16000,17000,18000,19000,20000,
- 3 21000,22000,23000,24000,25000,26000,27000),
- 8 (RI-MXJOKE)
- CALL BUG(7,RI)
- C
- C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE.
- C
- 10 SVERBS=.FALSE. !LOSE.
- RETURN
- C
- C JOKE PROCESSOR.
- C FIND PROPER ENTRY IN JOKES, USE IT TO SELECT STRING TO PRINT.
- C
- 100 I=JOKES(RI-MXNOP) !GET TABLE ENTRY.
- J=I/1000 !ISOLATE # STRINGS.
- IF(J.NE.0) I=MOD(I,1000)+RND(J) !IF RANDOM, CHOOSE.
- CALL RSPEAK(I) !PRINT JOKE.
- RETURN
- C SVERBS, PAGE 2A
- C
- C V65-- ROOM
- C
- 65000 SVERBS=RMDESC(2) !DESCRIBE ROOM ONLY.
- RETURN
- C
- C V66-- OBJECTS
- C
- 66000 SVERBS=RMDESC(1) !DESCRIBE OBJ ONLY.
- IF(.NOT.TELFLG) CALL RSPEAK(138) !NO OBJECTS.
- RETURN
- C
- C V67-- RNAME
- C
- 67000 CALL RSPEAK(RDESC2-HERE) !SHORT ROOM NAME.
- RETURN
- C
- C V68-- RESERVED
- C
- 68000 RETURN
- C
- C V69-- RESERVED
- C
- 69000 RETURN
- C SVERBS, PAGE 3
- C
- C V70-- BRIEF. SET FLAG.
- C
- 1000 BRIEFF=.TRUE. !BRIEF DESCRIPTIONS.
- SUPERF=.FALSE.
- CALL RSPEAK(326)
- RETURN
- C
- C V71-- VERBOSE. CLEAR FLAGS.
- C
- 2000 BRIEFF=.FALSE. !LONG DESCRIPTIONS.
- SUPERF=.FALSE.
- CALL RSPEAK(327)
- RETURN
- C
- C V72-- SUPERBRIEF. SET FLAG.
- C
- 3000 SUPERF=.TRUE.
- CALL RSPEAK(328)
- RETURN
- C
- C V73-- STAY (USED IN ENDGAME).
- C
- 4000 IF(WINNER.NE.AMASTR) GO TO 4100 !TELL MASTER, STAY.
- CALL RSPEAK(781) !HE DOES.
- CTICK(CEVFOL)=0 !NOT FOLLOWING.
- RETURN
- C
- 4100 IF(WINNER.EQ.PLAYER) CALL RSPEAK(664) !JOKE.
- RETURN
- C
- C V74-- VERSION. PRINT INFO.
- C
- 5000 WRITE(OUTCH,5010) VMAJ,VMIN,VEDIT
- 5010 FORMAT(' V',I1,'.',I2,A1)
- TELFLG=.TRUE.
- RETURN
- C
- C V75-- SWIM. ALWAYS A JOKE.
- C
- 6000 I=330 !ASSUME WATER.
- IF((RFLAG(HERE).AND.(RWATER+RFILL)).EQ.0)
- 1 I=331+RND(3) !IF NO WATER, JOKE.
- CALL RSPEAK(I)
- RETURN
- C
- C V76-- GERONIMO. IF IN BARREL, FATAL, ELSE JOKE.
- C
- 7000 IF(HERE.EQ.MBARR) GO TO 7100 !IN BARREL?
- CALL RSPEAK(334) !NO, JOKE.
- RETURN
- C
- 7100 CALL JIGSUP(335) !OVER FALLS.
- RETURN
- C
- C V77-- SINBAD ET AL. CHASE CYCLOPS, ELSE JOKE.
- C
- 8000 IF((HERE.EQ.MCYCL).AND.QHERE(CYCLO,HERE)) GO TO 8100
- CALL RSPEAK(336) !NOT HERE, JOKE.
- RETURN
- C
- 8100 CALL NEWSTA(CYCLO,337,0,0,0) !CYCLOPS FLEES.
- CYCLOF=.TRUE. !SET ALL FLAGS.
- MAGICF=.TRUE.
- OFLAG2(CYCLO)=OFLAG2(CYCLO).AND. .NOT.FITEBT
- RETURN
- C
- C V78-- WELL. OPEN DOOR, ELSE JOKE.
- C
- 9000 IF(RIDDLF.OR.(HERE.NE.RIDDL)) GO TO 9100 !IN RIDDLE ROOM?
- RIDDLF=.TRUE. !YES, SOLVED IT.
- CALL RSPEAK(338)
- RETURN
- C
- 9100 CALL RSPEAK(339) !WELL, WHAT?
- RETURN
- C
- C V79-- PRAY. IF IN TEMP2, POOF!
- C
- 10000 IF(HERE.NE.TEMP2) GO TO 10050 !IN TEMPLE?
- IF(MOVETO(FORE1,WINNER)) GO TO 10100 !FORE1 STILL THERE?
- 10050 CALL RSPEAK(340) !JOKE.
- RETURN
- C
- 10100 F=RMDESC(3) !MOVED, DESCRIBE.
- RETURN
- C
- C V80-- TREASURE. IF IN TEMP1, POOF!
- C
- 11000 IF(HERE.NE.TEMP1) GO TO 11050 !IN TEMPLE?
- IF(MOVETO(TREAS,WINNER)) GO TO 10100 !TREASURE ROOM THERE?
- 11050 CALL RSPEAK(341) !NOTHING HAPPENS.
- RETURN
- C
- C V81-- TEMPLE. IF IN TREAS, POOF!
- C
- 12000 IF(HERE.NE.TREAS) GO TO 12050 !IN TREASURE?
- IF(MOVETO(TEMP1,WINNER)) GO TO 10100 !TEMP1 STILL THERE?
- 12050 CALL RSPEAK(341) !NOTHING HAPPENS.
- RETURN
- C
- C V82-- BLAST. USUALLY A JOKE.
- C
- 13000 I=342 !DONT UNDERSTAND.
- IF(PRSO.EQ.SAFE) I=252 !JOKE FOR SAFE.
- CALL RSPEAK(I)
- RETURN
- C
- C V83-- SCORE. PRINT SCORE.
- C
- 14000 CALL SCORE(.FALSE.)
- RETURN
- C
- C V84-- QUIT. FINISH OUT THE GAME.
- C
- 15000 CALL SCORE(.TRUE.) !TELLL SCORE.
- IF(.NOT.YESNO(343,0,0)) RETURN !ASK FOR Y/N DECISION.
- CLOSE (UNIT=DBCH) !CLEAN UP.
- CALL EXIT !BYE.
- C SVERBS, PAGE 4
- C
- C V85-- FOLLOW (USED IN ENDGAME)
- C
- 16000 IF(WINNER.NE.AMASTR) RETURN !TELL MASTER, FOLLOW.
- CALL RSPEAK(782)
- CTICK(CEVFOL)=-1 !STARTS FOLLOWING.
- RETURN
- C
- C V86-- WALK THROUGH
- C
- 17000 IF((SCOLRM.EQ.0).OR.((PRSO.NE.SCOL).AND.
- 1 ((PRSO.NE.WNORT).OR.(HERE.NE.BKBOX)))) GO TO 17100
- SCOLAC=SCOLRM !WALKED THRU SCOL.
- PRSO=0 !FAKE OUT FROMDR.
- CTICK(CEVSCL)=6 !START ALARM.
- CALL RSPEAK(668) !DISORIENT HIM.
- F=MOVETO(SCOLRM,WINNER) !INTO ROOM.
- F=RMDESC(3) !DESCRIBE.
- RETURN
- C
- 17100 IF(HERE.NE.SCOLAC) GO TO 17300 !ON OTHER SIDE OF SCOL?
- DO 17200 I=1,12,3 !WALK THRU PROPER WALL?
- IF((SCOLWL(I).EQ.HERE).AND.(SCOLWL(I+1).EQ.PRSO))
- 1 GO TO 17500 !IN SPECIFIED ROOM?
- 17200 CONTINUE
- C
- 17300 IF((OFLAG1(PRSO).AND.TAKEBT).NE.0) GO TO 17400 !TKBLE?
- I=669 !NO, JOKE.
- IF(PRSO.EQ.SCOL) I=670 !SPECIAL JOKE FOR SCOL.
- CALL RSPSUB(I,ODO2)
- RETURN
- C
- 17400 I=671 !JOKE.
- IF(OROOM(PRSO).NE.0) I=552+RND(5) !SPECIAL JOKES IF CARRY.
- CALL RSPEAK(I)
- RETURN
- C
- 17500 PRSO=SCOLWL(I+2) !THRU SCOL WALL...
- DO 17600 I=1,8,2 !FIND MATCHING ROOM.
- IF(PRSO.EQ.SCOLDR(I)) SCOLRM=SCOLDR(I+1)
- 17600 CONTINUE !DECLARE NEW SCOLRM.
- CTICK(CEVSCL)=0 !CANCEL ALARM.
- CALL RSPEAK(668) !DISORIENT HIM.
- F=MOVETO(BKBOX,WINNER) !BACK IN BOX ROOM.
- F=RMDESC(3)
- RETURN
- C
- C V87-- RING. A JOKE.
- C
- 18000 I=359 !CANT RING.
- IF(PRSO.EQ.BELL) I=360 !DING, DONG.
- CALL RSPEAK(I) !JOKE.
- RETURN
- C
- C V88-- BRUSH. JOKE WITH OBSCURE TRAP.
- C
- 19000 IF(PRSO.EQ.TEETH) GO TO 19100 !BRUSH TEETH?
- CALL RSPEAK(362) !NO, JOKE.
- RETURN
- C
- 19100 IF(PRSI.NE.0) GO TO 19200 !WITH SOMETHING?
- CALL RSPEAK(363) !NO, JOKE.
- RETURN
- C
- 19200 IF((PRSI.EQ.PUTTY).AND.(OADV(PUTTY).EQ.WINNER))
- 1 GO TO 19300 !WITH PUTTY?
- CALL RSPSUB(364,ODI2) !NO, JOKE.
- RETURN
- C
- 19300 CALL JIGSUP(365) !YES, DEAD!!!!!
- RETURN
- C SVERBS, PAGE 5
- C
- C V89-- DIG. UNLESS SHOVEL, A JOKE.
- C
- 20000 IF(PRSO.EQ.SHOVE) RETURN !SHOVEL?
- I=392 !ASSUME TOOL.
- IF((OFLAG1(PRSO).AND.TOOLBT).EQ.0) I=393
- CALL RSPSUB(I,ODO2)
- RETURN
- C
- C V90-- TIME. PRINT OUT DURATION OF GAME.
- C
- 21000 CALL GTTIME(K) !GET PLAY TIME.
- I=K/60
- J=MOD(K,60)
- WRITE(OUTCH,21010)
- IF(I.NE.0) WRITE(OUTCH,21011) I
- IF(I.GE.2) WRITE(OUTCH,21012)
- IF(I.EQ.1) WRITE(OUTCH,21013)
- IF(J.EQ.1) WRITE(OUTCH,21014) J
- IF(J.NE.1) WRITE(OUTCH,21015) J
- TELFLG=.TRUE.
- RETURN
- C
- 21010 FORMAT(' You have been playing Dungeon for ',$)
- 21011 FORMAT('+',I3,' hour',$)
- 21012 FORMAT('+s and ',$)
- 21013 FORMAT('+ and ',$)
- 21014 FORMAT('+',I2,' minute.')
- 21015 FORMAT('+',I2,' minutes.')
- C
- C V91-- LEAP. USUALLY A JOKE, WITH A CATCH.
- C
- 22000 IF(PRSO.EQ.0) GO TO 22200 !OVER SOMETHING?
- IF(QHERE(PRSO,HERE)) GO TO 22100 !HERE?
- CALL RSPEAK(447) !NO, JOKE.
- RETURN
- C
- 22100 IF((OFLAG2(PRSO).AND.VILLBT).EQ.0) GO TO 22300
- CALL RSPSUB(448,ODO2) !CANT JUMP VILLAIN.
- RETURN
- C
- 22200 IF(.NOT.FINDXT(XDOWN,HERE)) GO TO 22300 !DOWN EXIT?
- IF((XTYPE.EQ.XNO).OR.((XTYPE.EQ.XCOND).AND.
- 1 .NOT.FLAGS(XFLAG))) GO TO 22400 !BLOCKED OFF?
- 22300 CALL RSPEAK(314+RND(5)) !WHEEEE!
- RETURN
- C
- 22400 CALL JIGSUP(449+RND(4)) !FATAL LEAP.
- RETURN
- C SVERBS, PAGE 6
- C
- C V92-- LOCK.
- C
- 23000 IF((PRSO.EQ.GRATE).AND.(HERE.EQ.MGRAT))
- 1 GO TO 23200
- 23100 CALL RSPEAK(464) !NOT LOCK GRATE.
- RETURN
- C
- 23200 GRUNLF=.FALSE. !GRATE NOW LOCKED.
- CALL RSPEAK(214)
- TRAVEL(REXIT(HERE)+1)=214 !CHANGE EXIT STATUS.
- RETURN
- C
- C V93-- UNLOCK
- C
- 24000 IF((PRSO.NE.GRATE).OR.(HERE.NE.MGRAT))
- 1 GO TO 23100 !NOT UNLOCK GRATE.
- IF(PRSI.EQ.KEYS) GO TO 24200 !GOT KEYS?
- CALL RSPSUB(465,ODI2) !NO, JOKE.
- RETURN
- C
- 24200 GRUNLF=.TRUE. !UNLOCK GRATE.
- CALL RSPEAK(217)
- TRAVEL(REXIT(HERE)+1)=217 !CHANGE EXIT STATUS.
- RETURN
- C
- C V94-- DIAGNOSE.
- C
- 25000 I=FIGHTS(WINNER,.FALSE.) !GET FIGHTS STRENGTH.
- J=ASTREN(WINNER) !GET HEALTH.
- K=MIN0(I+J,4) !GET STATE.
- IF(.NOT.CFLAG(CEVCUR)) J=0 !IF NO WOUNDS.
- L=MIN0(4,IABS(J)) !SCALE.
- CALL RSPEAK(473+L) !DESCRIBE HEALTH.
- I=(30*(-J-1))+CTICK(CEVCUR) !COMPUTE WAIT.
- IF(J.NE.0) WRITE(OUTCH,25100) I
- 25100 FORMAT(' You will be cured after ',I3,' moves.')
- CALL RSPEAK(478+K) !HOW MUCH MORE?
- IF(DEATHS.NE.0) CALL RSPEAK(482+DEATHS) !HOW MANY DEATHS?
- RETURN
- C SVERBS, PAGE 7
- C
- C V95-- INCANT
- C
- 26000 DO 26100 I=1,6 !SET UP PARSE.
- P1(I)=' '
- P2(I)=' '
- 26100 CONTINUE
- WP=1 !WORD POINTER.
- CP=1 !CHAR POINTER.
- IF(PRSCON.LE.1) GO TO 26300
- DO 26200 I=PRSCON,INLNT !PARSE INPUT
- IF(INBUF(I).EQ.',') GO TO 26300 !END OF PHRASE?
- IF(INBUF(I).NE.' ') GO TO 26150 !SPACE?
- IF(CP.NE.1) WP=WP+1
- CP=1
- GO TO 26200
- 26150 IF(WP.EQ.1) P1(CP)=INBUF(I) !STUFF INTO HOLDER.
- IF(WP.EQ.2) P2(CP)=INBUF(I)
- CP=MIN0(CP+1,6)
- 26200 CONTINUE
- C
- 26300 PRSCON=1 !KILL REST OF LINE.
- IF(P1(1).NE.' ') GO TO 26400 !ANY INPUT?
- CALL RSPEAK(856) !NO, HO HUM.
- RETURN
- C
- 26400 CALL ENCRYP(P1,CH) !COMPUTE RESPONSE.
- IF(P2(1).NE.' ') GO TO 26600 !TWO PHRASES?
- C
- IF(SPELLF) GO TO 26550 !HE'S TRYING TO LEARN.
- IF((RFLAG(TSTRS).AND.RSEEN).EQ.0) GO TO 26575
- SPELLF=.TRUE. !TELL HIM.
- TELFLG=.TRUE.
- WRITE(OUTCH,26510) P1,CH
- 26510 FORMAT(' A hollow voice replies: "',6A1,1X,6A1,'".')
- RETURN
- C
- 26550 CALL RSPEAK(857) !HE'S GOT ONE ALREADY.
- RETURN
- C
- 26575 CALL RSPEAK(858) !HE'S NOT IN ENDGAME.
- RETURN
- C
- 26600 IF((RFLAG(TSTRS).AND.RSEEN).NE.0) GO TO 26800
- DO 26700 I=1,6
- IF(P2(I).NE.CH(I)) GO TO 26575 !WRONG.
- 26700 CONTINUE
- SPELLF=.TRUE. !IT WORKS.
- CALL RSPEAK(859)
- CTICK(CEVSTE)=1 !FORCE START.
- RETURN
- C
- 26800 CALL RSPEAK(855) !TOO LATE.
- RETURN
- C SVERBS, PAGE 8
- C
- C V96-- ANSWER
- C
- 27000 IF((PRSCON.GT.1).AND.
- 1 (HERE.EQ.FDOOR).AND.INQSTF)
- 2 GO TO 27100
- CALL RSPEAK(799) !NO ONE LISTENS.
- PRSCON=1
- RETURN
- C
- 27100 K=1 !POINTER INTO ANSSTR.
- DO 27300 J=1,28,2 !CHECK ANSWERS.
- NEWK=K+ANSWER(J+1) !COMPUTE NEXT K.
- IF(QUESNO.NE.ANSWER(J)) GO TO 27300 !ONLY CHECK PROPER ANS.
- I=PRSCON-1 !SCAN ANSWER.
- DO 27200 L=K,NEWK-1
- 27150 I=I+1 !SKIP INPUT BLANKS.
- IF(I.GT.INLNT) GO TO 27300 !END OF INPUT? LOSE.
- IF(INBUF(I).EQ.' ') GO TO 27150
- IF(INBUF(I).NE.ANSSTR(L)) GO TO 27300
- 27200 CONTINUE
- GO TO 27500 !RIGHT ANSWER.
- 27300 K=NEWK
- C
- PRSCON=1 !KILL REST OF LINE.
- NQATT=NQATT+1 !WRONG, CRETIN.
- IF(NQATT.GE.5) GO TO 27400 !TOO MANY WRONG?
- CALL RSPEAK(800+NQATT) !NO, TRY AGAIN.
- RETURN
- C
- 27400 CALL RSPEAK(826) !ALL OVER.
- CFLAG(CEVINQ)=.FALSE. !LOSE.
- RETURN
- C
- 27500 PRSCON=1 !KILL REST OF LINE.
- CORRCT=CORRCT+1 !GOT IT RIGHT.
- CALL RSPEAK(800) !HOORAY.
- IF(CORRCT.GE.3) GO TO 27600 !WON TOTALLY?
- CTICK(CEVINQ)=2 !NO, START AGAIN.
- QUESNO=MOD(QUESNO+3,8)
- NQATT=0
- CALL RSPEAK(769) !ASK NEXT QUESTION.
- CALL RSPEAK(770+QUESNO)
- RETURN
- C
- 27600 CALL RSPEAK(827) !QUIZ OVER,
- CFLAG(CEVINQ)=.FALSE.
- OFLAG2(QDOOR)=OFLAG2(QDOOR).OR.OPENBT !OPEN DOOR.
- RETURN
- C
- END
-