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