home *** CD-ROM | disk | FTP | other *** search
- C SOBJS- SIMPLE OBJECTS PROCESSOR
- C OBJECTS IN THIS MODULE CANNOT CALL RMINFO, JIGSUP,
- C MAJOR VERBS, OR OTHER NON-RESIDENT SUBROUTINES
- 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 SOBJS(RI,ARG)
- IMPLICIT INTEGER (A-Z)
- LOGICAL QOPEN
- LOGICAL MOVETO,OPNCLS,LIT
- LOGICAL QHERE,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
- 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 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 VILLAINS AND DEMONS
- C
- LOGICAL THFFLG,SWDACT,THFACT
- COMMON /HACK/ THFPOS,THFFLG,THFACT,SWDACT,SWDSTA
- 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 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
- C SOBJS, PAGE 2
- C
- IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
- IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
- AV=AVEHIC(WINNER)
- SOBJS=.TRUE.
- C
- GO TO (1000,3000,4000,6000,7000,8000,9000,
- 1 13000,14000,16000,17000,
- 2 21000,23000,24000,27000,28000,29000,30000,
- 3 31000,33000,34000,36000,37000,38000,
- 4 41000,42000,43000,44000,46000,
- 5 53000,56000)
- 6 RI
- CALL BUG(6,RI)
- C
- C RETURN HERE TO DECLARE FALSE RESULT
- C
- 10 SOBJS=.FALSE.
- RETURN
- C SOBJS, PAGE 3
- C
- C O1-- GUNK FUNCTION
- C
- 1000 IF(OCAN(GUNK).EQ.0) GO TO 10 !NOT INSIDE? F
- CALL NEWSTA(GUNK,122,0,0,0) !FALLS APART.
- RETURN
- C
- C O2-- TROPHY CASE
- C
- 3000 IF(PRSA.NE.TAKEW) GO TO 10 !TAKE?
- CALL RSPEAK(128) !CANT.
- RETURN
- C
- C O3-- BOTTLE FUNCTION
- C
- 4000 IF(PRSA.NE.THROWW) GO TO 4100 !THROW?
- CALL NEWSTA(PRSO,129,0,0,0) !BREAKS.
- RETURN
- C
- 4100 IF(PRSA.NE.MUNGW) GO TO 10 !MUNG?
- CALL NEWSTA(PRSO,131,0,0,0) !BREAKS.
- RETURN
- C SOBJS, PAGE 4
- C
- C O4-- ROPE FUNCTION
- C
- 6000 IF(HERE.EQ.DOME) GO TO 6100 !IN DOME?
- DOMEF=.FALSE. !NO,
- IF(PRSA.NE.UNTIEW) GO TO 6050 !UNTIE?
- CALL RSPEAK(134) !CANT
- RETURN
- C
- 6050 IF(PRSA.NE.TIEW) GO TO 10 !TIE?
- CALL RSPEAK(135) !CANT TIE
- RETURN
- C
- 6100 IF((PRSA.NE.TIEW).OR.(PRSI.NE.RAILI)) GO TO 6200
- IF(DOMEF) GO TO 6150 !ALREADY TIED?
- DOMEF=.TRUE. !NO, TIE IT.
- OFLAG1(ROPE)=OFLAG1(ROPE).OR.NDSCBT
- OFLAG2(ROPE)=OFLAG2(ROPE).OR.CLMBBT
- CALL NEWSTA(ROPE,137,DOME,0,0)
- RETURN
- C
- 6150 CALL RSPEAK(136) !DUMMY.
- RETURN
- C
- 6200 IF(PRSA.NE.UNTIEW) GO TO 6300 !UNTIE?
- IF(DOMEF) GO TO 6250 !TIED?
- CALL RSPEAK(134) !NO, DUMMY.
- RETURN
- C
- 6250 DOMEF=.FALSE. !YES, UNTIE IT.
- OFLAG1(ROPE)=OFLAG1(ROPE).AND. .NOT.NDSCBT
- OFLAG2(ROPE)=OFLAG2(ROPE).AND. .NOT.CLMBBT
- CALL RSPEAK(139)
- RETURN
- C
- 6300 IF(DOMEF.OR.(PRSA.NE.DROPW)) GO TO 6400 !DROP & UNTIED?
- CALL NEWSTA(ROPE,140,MTORC,0,0) !YES, DROP.
- RETURN
- C
- 6400 IF((PRSA.NE.TAKEW).OR. .NOT.DOMEF) GO TO 10
- CALL RSPEAK(141) !TAKE & TIED.
- RETURN
- C
- C O5-- SWORD FUNCTION
- C
- 7000 IF((PRSA.EQ.TAKEW).AND.(WINNER.EQ.PLAYER))
- 1 SWDACT=.TRUE. !TURN ON DEMON.
- GO TO 10
- C
- C O6-- LANTERN
- C
- 8000 IF(PRSA.NE.THROWW) GO TO 8100 !THROW?
- CALL NEWSTA(LAMP,0,0,0,0) !KILL LAMP,
- CALL NEWSTA(BLAMP,142,HERE,0,0) !REPLACE WITH BROKEN.
- RETURN
- C
- 8100 IF(PRSA.EQ.TRNONW) CFLAG(CEVLNT)=.TRUE.
- IF(PRSA.EQ.TRNOFW) CFLAG(CEVLNT)=.FALSE.
- GO TO 10
- C
- C O7-- RUG FUNCTION
- C
- 9000 IF(PRSA.NE.RAISEW) GO TO 9100 !RAISE?
- CALL RSPEAK(143) !CANT
- RETURN
- C
- 9100 IF(PRSA.NE.TAKEW) GO TO 9200 !TAKE?
- CALL RSPEAK(144) !CANT
- RETURN
- C
- 9200 IF(PRSA.NE.MOVEW) GO TO 9300 !MOVE?
- CALL RSPEAK(145+ORRUG)
- ORRUG=1
- OFLAG1(DOOR)=OFLAG1(DOOR).OR.VISIBT !REVEAL DOOR.
- RETURN
- C
- 9300 IF((PRSA.NE.LOOKUW).OR.(ORRUG.NE.0).OR.
- 1 QOPEN(DOOR)) GO TO 10 !LOOK UNDER RUG?
- CALL RSPEAK(345)
- RETURN
- C SOBJS, PAGE 5
- C
- C O8-- SKELETON
- C
- 13000 I=ROBRM(HERE,100,LLD2,0,0)+ROBADV(WINNER,LLD2,0,0)
- IF(I.NE.0) CALL RSPEAK(162) !IF ROBBED, SAY SO.
- RETURN
- C
- C O9-- MIRROR
- C
- 14000 IF(MIRRMF.OR.(PRSA.NE.RUBW)) GO TO 14500
- MROOM=HERE.XOR.1 !CALCULATE NEW RM.
- DO 14100 I=1,OLNT !INTERCHANGE OBJS.
- IF(OROOM(I).EQ.HERE) OROOM(I)=-1
- IF(OROOM(I).EQ.MROOM) OROOM(I)=HERE
- IF(OROOM(I).EQ.-1) OROOM(I)=MROOM
- 14100 CONTINUE
- F=MOVETO(MROOM,WINNER)
- CALL RSPEAK(163) !SHAKE WORLD.
- RETURN
- C
- 14500 IF((PRSA.NE.LOOKW).AND.(PRSA.NE.LOOKIW).AND.
- 1 (PRSA.NE.EXAMIW)) GO TO 14600
- I=164 !MIRROR OK.
- IF(MIRRMF) I=165 !MIRROR DEAD.
- CALL RSPEAK(I)
- RETURN
- C
- 14600 IF(PRSA.NE.TAKEW) GO TO 14700 !TAKE?
- CALL RSPEAK(166) !JOKE.
- RETURN
- C
- 14700 IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
- I=167 !MIRROR BREAKS.
- IF(MIRRMF) I=168 !MIRROR ALREADY BROKEN.
- MIRRMF=.TRUE.
- BADLKF=.TRUE.
- CALL RSPEAK(I)
- RETURN
- C SOBJS, PAGE 6
- C
- C O10-- DUMBWAITER
- C
- 16000 IF(PRSA.NE.RAISEW) GO TO 16100 !RAISE?
- IF(CAGETF) GO TO 16400 !ALREADY AT TOP?
- CALL NEWSTA(TBASK,175,TSHAF,0,0) !NO, RAISE BASKET.
- CALL NEWSTA(FBASK,0,BSHAF,0,0)
- CAGETF=.TRUE. !AT TOP.
- RETURN
- C
- 16100 IF(PRSA.NE.LOWERW) GO TO 16200 !LOWER?
- IF(.NOT.CAGETF) GO TO 16400 !ALREADY AT BOTTOM?
- CALL NEWSTA(TBASK,176,BSHAF,0,0) !NO, LOWER BASKET.
- CALL NEWSTA(FBASK,0,TSHAF,0,0)
- CAGETF=.FALSE.
- IF(.NOT.LIT(HERE)) CALL RSPEAK(406) !IF DARK, DIE.
- RETURN
- C
- 16200 IF((PRSO.NE.FBASK).AND.(PRSI.NE.FBASK)) GO TO 16300
- CALL RSPEAK(130) !WRONG BASKET.
- RETURN
- C
- 16300 IF(PRSA.NE.TAKEW) GO TO 10 !TAKE?
- CALL RSPEAK(177) !JOKE.
- RETURN
- C
- 16400 CALL RSPEAK(125+RND(3)) !DUMMY.
- RETURN
- C
- C O11-- GHOST FUNCTION
- C
- 17000 I=178 !ASSUME DIRECT.
- IF(PRSO.NE.GHOST) I=179 !IF NOT, INDIRECT.
- CALL RSPEAK(I)
- RETURN !SPEAK AND EXIT.
- C SOBJS, PAGE 7
- C
- C O12-- TUBE
- C
- 21000 IF((PRSA.NE.PUTW).OR.(PRSI.NE.TUBE)) GO TO 10
- CALL RSPEAK(186) !CANT PUT BACK IN.
- RETURN
- C
- C O13-- CHALICE
- C
- 23000 IF((PRSA.NE.TAKEW).OR.(OCAN(PRSO).NE.0).OR.
- 1 (OROOM(PRSO).NE.TREAS).OR.(OROOM(THIEF).NE.TREAS).OR.
- 2 ((OFLAG2(THIEF).AND.FITEBT).EQ.0).OR.
- 3 .NOT. THFACT) GO TO 10
- CALL RSPEAK(204) !CANT TAKE.
- RETURN
- C
- C O14-- PAINTING
- C
- 24000 IF(PRSA.NE.MUNGW) GO TO 10 !MUNG?
- CALL RSPEAK(205) !DESTROY PAINTING.
- OFVAL(PRSO)=0
- OTVAL(PRSO)=0
- ODESC1(PRSO)=207
- ODESC2(PRSO)=206
- RETURN
- C SOBJS, PAGE 8
- C
- C O15-- BOLT
- C
- 27000 IF(PRSA.NE.TURNW) GO TO 10 !TURN BOLT?
- IF(PRSI.NE.WRENC) GO TO 27500 !WITH WRENCH?
- IF(GATEF) GO TO 27100 !PROPER BUTTON PUSHED?
- CALL RSPEAK(210) !NO, LOSE.
- RETURN
- C
- 27100 IF(LWTIDF) GO TO 27200 !LOW TIDE NOW?
- LWTIDF=.TRUE. !NO, EMPTY DAM.
- CALL RSPEAK(211)
- OFLAG2(COFFI)=OFLAG2(COFFI).AND. .NOT.SCRDBT
- OFLAG1(TRUNK)=OFLAG1(TRUNK).OR.VISIBT !MATERIALIZE TRUNK.
- RFLAG(RESER)=(RFLAG(RESER).OR.RLAND)
- 1 .AND..NOT.(RWATER+RSEEN) !KEEP THIEF AWAY.
- RETURN
- C
- 27200 LWTIDF=.FALSE. !YES, FILL DAM.
- CALL RSPEAK(212)
- IF(QHERE(TRUNK,RESER)) OFLAG1(TRUNK)=OFLAG1(TRUNK)
- 1 .AND. .NOT.VISIBT
- RFLAG(RESER)=(RFLAG(RESER).OR.RWATER) .AND..NOT.RLAND
- RETURN
- C
- 27500 CALL RSPSUB(299,ODI2) !NOT WITH THAT.
- RETURN
- C
- C O16-- GRATING
- C
- 28000 IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 10
- IF(GRUNLF) GO TO 28200 !UNLOCKED?
- CALL RSPEAK(214) !NO, LOCKED.
- RETURN
- C
- 28200 I=215 !UNLOCKED, VIEW FRM CLR.
- IF(HERE.NE.CLEAR) I=216 !VIEW FROM BELOW.
- SOBJS=OPNCLS(GRATE,I,885) !OPEN/CLOSE.
- RFLAG(MGRAT)=RFLAG(MGRAT).AND. .NOT.RLIGHT !SET LIGHT/DARK.
- IF(QOPEN(GRATE)) RFLAG(MGRAT)=RFLAG(MGRAT).OR.RLIGHT
- IF(.NOT.LIT(HERE)) CALL RSPEAK(406) !IF DARK, DIE.
- RETURN
- C
- C O17-- TRAP DOOR
- C
- 29000 IF(HERE.NE.LROOM) GO TO 29100 !FROM LIVING ROOM?
- SOBJS=OPNCLS(DOOR,218,219) !OPEN/CLOSE.
- RETURN
- C
- 29100 IF(HERE.NE.CELLA) GO TO 10 !FROM CELLAR?
- IF((PRSA.NE.OPENW).OR.QOPEN(DOOR)) GO TO 29200
- CALL RSPEAK(220) !CANT OPEN CLOSED DOOR.
- RETURN
- C
- 29200 SOBJS=OPNCLS(DOOR,0,22) !NORMAL OPEN/CLOSE.
- RETURN
- C
- C O18-- DURABLE DOOR
- C
- 30000 I=0 !ASSUME NO APPL.
- IF(PRSA.EQ.OPENW) I=221 !OPEN?
- IF(PRSA.EQ.BURNW) I=222 !BURN?
- IF(PRSA.EQ.MUNGW) I=223+RND(3) !MUNG?
- IF(I.EQ.0) GO TO 10
- CALL RSPEAK(I)
- RETURN
- C
- C O19-- MASTER SWITCH
- C
- 31000 IF(PRSA.NE.TURNW) GO TO 10 !TURN?
- IF(PRSI.NE.SCREW) GO TO 31500 !WITH SCREWDRIVER?
- IF(QOPEN(MACHI)) GO TO 31600 !LID UP?
- CALL RSPEAK(226) !NO, ACTIVATE.
- IF(OCAN(COAL).NE.MACHI) GO TO 31400 !COAL INSIDE?
- CALL NEWSTA(COAL,0,0,0,0) !KILL COAL,
- CALL NEWSTA(DIAMO,0,0,MACHI,0) !REPLACE WITH DIAMOND.
- RETURN
- C
- 31400 DO 31450 I=1,OLNT !KILL NONCOAL OBJECTS.
- IF(OCAN(I).NE.MACHI) GO TO 31450 !INSIDE MACHINE?
- CALL NEWSTA(I,0,0,0,0) !KILL OBJECT AND CONTENTS.
- CALL NEWSTA(GUNK,0,0,MACHI,0) !REDUCE TO GUNK.
- 31450 CONTINUE
- RETURN
- C
- 31500 CALL RSPSUB(300,ODI2) !CANT TURN WITH THAT.
- RETURN
- C
- 31600 CALL RSPEAK(227) !LID IS UP.
- RETURN
- C SOBJS, PAGE 9
- C
- C O20-- LEAK
- C
- 33000 IF((PRSO.NE.LEAK).OR.(PRSA.NE.PLUGW).OR.(RVMNT.LE.0))
- 1 GO TO 10 !PLUG ACTIVE LEAK?
- IF(PRSI.NE.PUTTY) GO TO 33100 !WITH PUTTY?
- RVMNT=-1 !DISABLE LEAK.
- CTICK(CEVMNT)=0
- CALL RSPEAK(577)
- RETURN
- C
- 33100 CALL RSPSUB(301,ODI2) !CANT WITH THAT.
- RETURN
- C
- C O21-- DROWNING BUTTONS
- C
- 34000 IF(PRSA.NE.PUSHW) GO TO 10 !PUSH?
- GO TO (34100,34200,34300,34400),(PRSO-RBUTT+1)
- GO TO 10 !NOT A BUTTON.
- C
- 34100 RFLAG(HERE)=RFLAG(HERE).XOR.RLIGHT !RED, ZAP LIGHTS.
- I=230
- IF((RFLAG(HERE).AND.RLIGHT).NE.0) I=231
- CALL RSPEAK(I)
- RETURN
- C
- 34200 GATEF=.TRUE. !RELEASE GATE.
- CALL RSPEAK(232)
- RETURN
- C
- 34300 GATEF=.FALSE. !INTERLOCK GATE.
- CALL RSPEAK(232)
- RETURN
- C
- 34400 IF(RVMNT.NE.0) GO TO 34500 !LEAK ALREADY STARTED?
- CALL RSPEAK(233) !NO, START LEAK.
- RVMNT=1
- CTICK(CEVMNT)=-1
- RETURN
- C
- 34500 CALL RSPEAK(234) !BUTTON JAMMED.
- RETURN
- C
- C O22-- INFLATABLE BOAT
- C
- 36000 IF(PRSA.NE.INFLAW) GO TO 10 !INFLATE?
- IF(OROOM(IBOAT).NE.0) GO TO 36100 !IN ROOM?
- CALL RSPEAK(235) !NO, JOKE.
- RETURN
- C
- 36100 IF(PRSI.NE.PUMP) GO TO 36200 !WITH PUMP?
- CALL NEWSTA(IBOAT,0,0,0,0) !KILL DEFL BOAT,
- CALL NEWSTA(RBOAT,236,HERE,0,0) !REPL WITH INF.
- DEFLAF=.FALSE.
- RETURN
- C
- 36200 I=237 !JOKES.
- IF(PRSI.NE.LUNGS) I=303
- CALL RSPSUB(I,ODI2)
- RETURN
- C
- C O23-- DEFLATED BOAT
- C
- 37000 IF(PRSA.NE.INFLAW) GO TO 37100 !INFLATE?
- CALL RSPEAK(238) !JOKE.
- RETURN
- C
- 37100 IF(PRSA.NE.PLUGW) GO TO 10 !PLUG?
- IF(PRSI.NE.PUTTY) GO TO 33100 !WITH PUTTY?
- CALL NEWSTA(IBOAT,239,OROOM(DBOAT),OCAN(DBOAT),OADV(DBOAT))
- CALL NEWSTA(DBOAT,0,0,0,0) !KILL DEFL BOAT, REPL.
- RETURN
- C SOBJS, PAGE 10
- C
- C O24-- RUBBER BOAT
- C
- 38000 IF(ARG.NE.0) GO TO 10 !DISMISS READIN, OUT.
- IF((PRSA.NE.BOARDW).OR.(OADV(STICK).NE.WINNER)) GO TO 38100
- CALL NEWSTA(RBOAT,0,0,0,0) !KILL INFL BOAT,
- CALL NEWSTA(DBOAT,240,HERE,0,0) !REPL WITH DEAD.
- DEFLAF=.TRUE.
- RETURN
- C
- 38100 IF(PRSA.NE.INFLAW) GO TO 38200 !INFLATE?
- CALL RSPEAK(367) !YES, JOKE.
- RETURN
- C
- 38200 IF(PRSA.NE.DEFLAW) GO TO 10 !DEFLATE?
- IF(AV.EQ.RBOAT) GO TO 38300 !IN BOAT?
- IF(OROOM(RBOAT).EQ.0) GO TO 38400 !ON GROUND?
- CALL NEWSTA(RBOAT,0,0,0,0) !KILL INFL BOAT,
- CALL NEWSTA(IBOAT,241,HERE,0,0) !REPL WITH DEFL.
- DEFLAF=.TRUE.
- RETURN
- C
- 38300 CALL RSPEAK(242) !IN BOAT.
- RETURN
- C
- 38400 CALL RSPEAK(243) !NOT ON GROUND.
- RETURN
- C
- C O25-- BRAIDED ROPE
- C
- 41000 IF((PRSA.NE.TIEW).OR.(PRSO.NE.BROPE).OR.
- 1 ((PRSI.NE.HOOK1).AND.(PRSI.NE.HOOK2)))
- 2 GO TO 41500 !TIE TO HOOK?
- BTIEF=PRSI !RECORD LOCATION.
- CFLAG(CEVBAL)=.FALSE. !STALL ASCENT.
- CALL RSPEAK(248)
- RETURN
- C
- 41500 IF((PRSA.NE.UNTIEW).OR.(PRSO.NE.BROPE)) GO TO 10
- IF(BTIEF.NE.0) GO TO 41600 !TIED UP?
- CALL RSPEAK(249) !NO, JOKE.
- RETURN
- C
- 41600 CALL RSPEAK(250)
- BTIEF=0 !UNTIE.
- CTICK(CEVBAL)=3 !RESTART CLOCK.
- CFLAG(CEVBAL)=.TRUE.
- RETURN
- C
- C O26-- SAFE
- C
- 42000 I=0 !ASSUME UNPROCESSED.
- IF(PRSA.EQ.TAKEW) I=251 !TAKE?
- IF((PRSA.EQ.OPENW).AND.SAFEF) I=253 !OPEN AFTER BLAST?
- IF((PRSA.EQ.OPENW).AND..NOT.SAFEF) I=254 !OPEN BEFORE BLAST?
- IF((PRSA.EQ.CLOSEW).AND.SAFEF) I=253 !CLOSE AFTER?
- IF((PRSA.EQ.CLOSEW).AND..NOT.SAFEF) I=255
- IF(I.EQ.0) GO TO 10
- CALL RSPEAK(I)
- RETURN
- C
- C O27-- FUSE
- C
- 43000 IF(PRSA.NE.BURNW) GO TO 10 !BURN?
- CALL RSPEAK(256)
- CTICK(CEVFUS)=2 !START COUNTDOWN.
- RETURN
- C
- C O28-- GNOME
- C
- 44000 IF((PRSA.NE.GIVEW).AND.(PRSA.NE.THROWW)) GO TO 44500
- IF(OTVAL(PRSO).EQ.0) GO TO 44100 !TREASURE?
- CALL RSPSUB(257,ODO2) !YES, GET DOOR.
- CALL NEWSTA(PRSO,0,0,0,0)
- CALL NEWSTA(GNOME,0,0,0,0) !VANISH GNOME.
- GNODRF=.TRUE.
- RETURN
- C
- 44100 CALL RSPSUB(258,ODO2) !NO, LOSE OBJECT.
- CALL NEWSTA(PRSO,0,0,0,0)
- RETURN
- C
- 44500 CALL RSPEAK(259) !NERVOUS GNOME.
- IF(.NOT.GNOMEF) CTICK(CEVGNO)=5 !SCHEDULE BYEBYE.
- GNOMEF=.TRUE.
- RETURN
- C
- C O29-- COKE BOTTLES
- C
- 46000 IF((PRSA.NE.THROWW).AND.(PRSA.NE.MUNGW)) GO TO 10
- CALL NEWSTA(PRSO,262,0,0,0) !MUNG BOTTLES.
- RETURN
- C SOBJS, PAGE 11
- C
- C
- C O30-- ROBOT
- C
- 53000 IF(PRSA.NE.GIVEW) GO TO 53200 !GIVE?
- CALL NEWSTA(PRSO,0,0,0,AROBOT) !PUT ON ROBOT.
- CALL RSPSUB(302,ODO2)
- RETURN
- C
- 53200 IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
- CALL NEWSTA(ROBOT,285,0,0,0) !KILL ROBOT.
- RETURN
- C
- C O31-- GRUE
- C
- 56000 IF(PRSA.NE.EXAMIW) GO TO 56100 !EXAMINE?
- CALL RSPEAK(288)
- RETURN
- C
- 56100 IF(PRSA.NE.FINDW) GO TO 10 !FIND?
- CALL RSPEAK(289)
- RETURN
- C
- END
-