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