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 #include "parser.h" #include "gamestate.h" #include "state.h" #include "rooms.h" #include "rflag.h" #include "rindex.h" #include "objects.h" #include "oflags.h" #include "oindex.h" #include "clock.h" #include "villians.h" #include "advers.h" #include "verbs.h" #include "flags.h" C C FUNCTIONS AND DATA C QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0 C SOBJS, PAGE 2 C IF(PRSO.GT.220) GO TO 5 IF(PRSO.NE.0) ODO2=ODESC2(PRSO) 5 IF(PRSI.NE.0) ODI2=ODESC2(PRSI) AV=AVEHIC(WINNER) SOBJS=.TRUE. C GO TO (1000,3000,4000,6000,7000,8000,9000, & 13000,14000,16000,17000, & 21000,23000,24000,27000,28000,29000,30000, & 31000,33000,34000,36000,37000,38000, & 41000,42000,43000,44000,46000, & 53000,56000) & 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 C !NOT INSIDE? F CALL NEWSTA(GUNK,122,0,0,0) C !FALLS APART. RETURN C C O2-- TROPHY CASE C 3000 IF(PRSA.NE.TAKEW) GO TO 10 C !TAKE? CALL RSPEAK(128) C !CANT. RETURN C C O3-- BOTTLE FUNCTION C 4000 IF(PRSA.NE.THROWW) GO TO 4100 C !THROW? CALL NEWSTA(PRSO,129,0,0,0) C !BREAKS. RETURN C 4100 IF(PRSA.NE.MUNGW) GO TO 10 C !MUNG? CALL NEWSTA(PRSO,131,0,0,0) C !BREAKS. RETURN C SOBJS, PAGE 4 C C O4-- ROPE FUNCTION C 6000 IF(HERE.EQ.DOME) GO TO 6100 C !IN DOME? DOMEF=.FALSE. C !NO, IF(PRSA.NE.UNTIEW) GO TO 6050 C !UNTIE? CALL RSPEAK(134) C !CANT RETURN C 6050 IF(PRSA.NE.TIEW) GO TO 10 C !TIE? CALL RSPEAK(135) C !CANT TIE RETURN C 6100 IF((PRSA.NE.TIEW).OR.(PRSI.NE.RAILI)) GO TO 6200 IF(DOMEF) GO TO 6150 C !ALREADY TIED? DOMEF=.TRUE. C !NO, TIE IT. OFLAG1(ROPE)=or(OFLAG1(ROPE),NDSCBT) OFLAG2(ROPE)=or(OFLAG2(ROPE),CLMBBT) CALL NEWSTA(ROPE,137,DOME,0,0) RETURN C 6150 CALL RSPEAK(136) C !DUMMY. RETURN C 6200 IF(PRSA.NE.UNTIEW) GO TO 6300 C !UNTIE? IF(DOMEF) GO TO 6250 C !TIED? CALL RSPEAK(134) C !NO, DUMMY. RETURN C 6250 DOMEF=.FALSE. C !YES, UNTIE IT. OFLAG1(ROPE)=and(OFLAG1(ROPE), not(NDSCBT)) OFLAG2(ROPE)=and(OFLAG2(ROPE), not(CLMBBT)) CALL RSPEAK(139) RETURN C 6300 IF(DOMEF.OR.(PRSA.NE.DROPW)) GO TO 6400 C !DROP & UNTIED? CALL NEWSTA(ROPE,140,MTORC,0,0) C !YES, DROP. RETURN C 6400 IF((PRSA.NE.TAKEW).OR. .NOT.DOMEF) GO TO 10 CALL RSPEAK(141) C !TAKE & TIED. RETURN C C O5-- SWORD FUNCTION C 7000 IF((PRSA.EQ.TAKEW).AND.(WINNER.EQ.PLAYER)) & SWDACT=.TRUE. GO TO 10 C C O6-- LANTERN C 8000 IF(PRSA.NE.THROWW) GO TO 8100 C !THROW? CALL NEWSTA(LAMP,0,0,0,0) C !KILL LAMP, CALL NEWSTA(BLAMP,142,HERE,0,0) C !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 C !RAISE? CALL RSPEAK(143) C !CANT RETURN C 9100 IF(PRSA.NE.TAKEW) GO TO 9200 C !TAKE? CALL RSPEAK(144) C !CANT RETURN C 9200 IF(PRSA.NE.MOVEW) GO TO 9300 C !MOVE? CALL RSPEAK(145+ORRUG) ORRUG=1 OFLAG1(DOOR)=or(OFLAG1(DOOR),VISIBT) RETURN C 9300 IF((PRSA.NE.LOOKUW).OR.(ORRUG.NE.0).OR. & QOPEN(DOOR)) GO TO 10 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) C !IF ROBBED, SAY SO. RETURN C C O9-- MIRROR C 14000 IF(MIRRMF.OR.(PRSA.NE.RUBW)) GO TO 14500 MROOM=xor(HERE,1) DO 14100 I=1,OLNT C !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) C !SHAKE WORLD. RETURN C 14500 IF((PRSA.NE.LOOKW).AND.(PRSA.NE.LOOKIW).AND. & (PRSA.NE.EXAMIW)) GO TO 14600 I=164 C !MIRROR OK. IF(MIRRMF) I=165 C !MIRROR DEAD. CALL RSPEAK(I) RETURN C 14600 IF(PRSA.NE.TAKEW) GO TO 14700 C !TAKE? CALL RSPEAK(166) C !JOKE. RETURN C 14700 IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10 I=167 C !MIRROR BREAKS. IF(MIRRMF) I=168 C !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 C !RAISE? IF(CAGETF) GO TO 16400 C !ALREADY AT TOP? CALL NEWSTA(TBASK,175,TSHAF,0,0) C !NO, RAISE BASKET. CALL NEWSTA(FBASK,0,BSHAF,0,0) CAGETF=.TRUE. C !AT TOP. RETURN C 16100 IF(PRSA.NE.LOWERW) GO TO 16200 C !LOWER? IF(.NOT.CAGETF) GO TO 16400 C !ALREADY AT BOTTOM? CALL NEWSTA(TBASK,176,BSHAF,0,0) C !NO, LOWER BASKET. CALL NEWSTA(FBASK,0,TSHAF,0,0) CAGETF=.FALSE. IF(.NOT.LIT(HERE)) CALL RSPEAK(406) C !IF DARK, DIE. RETURN C 16200 IF((PRSO.NE.FBASK).AND.(PRSI.NE.FBASK)) GO TO 16300 CALL RSPEAK(130) C !WRONG BASKET. RETURN C 16300 IF(PRSA.NE.TAKEW) GO TO 10 C !TAKE? CALL RSPEAK(177) C !JOKE. RETURN C 16400 CALL RSPEAK(125+RND(3)) C !DUMMY. RETURN C C O11-- GHOST FUNCTION C 17000 I=178 C !ASSUME DIRECT. IF(PRSO.NE.GHOST) I=179 C !IF NOT, INDIRECT. CALL RSPEAK(I) RETURN C !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) C !CANT PUT BACK IN. RETURN C C O13-- CHALICE C 23000 IF((PRSA.NE.TAKEW).OR.(OCAN(PRSO).NE.0).OR. & (OROOM(PRSO).NE.TREAS).OR.(OROOM(THIEF).NE.TREAS).OR. & (and(OFLAG2(THIEF),FITEBT).EQ.0).OR. & .NOT. THFACT) GO TO 10 CALL RSPEAK(204) C !CANT TAKE. RETURN C C O14-- PAINTING C 24000 IF(PRSA.NE.MUNGW) GO TO 10 C !MUNG? CALL RSPEAK(205) C !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 C !TURN BOLT? IF(PRSI.NE.WRENC) GO TO 27500 C !WITH WRENCH? IF(GATEF) GO TO 27100 C !PROPER BUTTON PUSHED? CALL RSPEAK(210) C !NO, LOSE. RETURN C 27100 IF(LWTIDF) GO TO 27200 C !LOW TIDE NOW? LWTIDF=.TRUE. C !NO, EMPTY DAM. CALL RSPEAK(211) OFLAG2(COFFI)=and(OFLAG2(COFFI), not(SCRDBT)) OFLAG1(TRUNK)=or(OFLAG1(TRUNK),VISIBT) RFLAG(RESER)=and(or(RFLAG(RESER),RLAND) & ,not(RWATER+RSEEN)) RETURN C 27200 LWTIDF=.FALSE. C !YES, FILL DAM. CALL RSPEAK(212) IF(QHERE(TRUNK,RESER)) & OFLAG1(TRUNK)=and(OFLAG1(TRUNK), not(VISIBT)) RFLAG(RESER)=and(or(RFLAG(RESER),RWATER) ,not(RLAND)) RETURN C 27500 CALL RSPSUB(299,ODI2) C !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 C !UNLOCKED? CALL RSPEAK(214) C !NO, LOCKED. RETURN C 28200 I=215 C !UNLOCKED, VIEW FRM CLR. IF(HERE.NE.CLEAR) I=216 C !VIEW FROM BELOW. SOBJS=OPNCLS(GRATE,I,885) C !OPEN/CLOSE. RFLAG(MGRAT)=and(RFLAG(MGRAT), not(RLIGHT)) IF(QOPEN(GRATE)) RFLAG(MGRAT)=or(RFLAG(MGRAT),RLIGHT) IF(.NOT.LIT(HERE)) CALL RSPEAK(406) C !IF DARK, DIE. RETURN C C O17-- TRAP DOOR C 29000 IF(HERE.NE.LROOM) GO TO 29100 C !FROM LIVING ROOM? SOBJS=OPNCLS(DOOR,218,219) C !OPEN/CLOSE. RETURN C 29100 IF(HERE.NE.CELLA) GO TO 10 C !FROM CELLAR? IF((PRSA.NE.OPENW).OR.QOPEN(DOOR)) GO TO 29200 CALL RSPEAK(220) C !CANT OPEN CLOSED DOOR. RETURN C 29200 SOBJS=OPNCLS(DOOR,0,22) C !NORMAL OPEN/CLOSE. RETURN C C O18-- DURABLE DOOR C 30000 I=0 C !ASSUME NO APPL. IF(PRSA.EQ.OPENW) I=221 C !OPEN? IF(PRSA.EQ.BURNW) I=222 C !BURN? IF(PRSA.EQ.MUNGW) I=223+RND(3) C !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 C !TURN? IF(PRSI.NE.SCREW) GO TO 31500 C !WITH SCREWDRIVER? IF(QOPEN(MACHI)) GO TO 31600 C !LID UP? CALL RSPEAK(226) C !NO, ACTIVATE. IF(OCAN(COAL).NE.MACHI) GO TO 31400 C !COAL INSIDE? CALL NEWSTA(COAL,0,0,0,0) C !KILL COAL, CALL NEWSTA(DIAMO,0,0,MACHI,0) C !REPLACE WITH DIAMOND. RETURN C 31400 DO 31450 I=1,OLNT C !KILL NONCOAL OBJECTS. IF(OCAN(I).NE.MACHI) GO TO 31450 C !INSIDE MACHINE? CALL NEWSTA(I,0,0,0,0) C !KILL OBJECT AND CONTENTS. CALL NEWSTA(GUNK,0,0,MACHI,0) C !REDUCE TO GUNK. 31450 CONTINUE RETURN C 31500 CALL RSPSUB(300,ODI2) C !CANT TURN WITH THAT. RETURN C 31600 CALL RSPEAK(227) C !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)) & GO TO 10 IF(PRSI.NE.PUTTY) GO TO 33100 C !WITH PUTTY? RVMNT=-1 C !DISABLE LEAK. CTICK(CEVMNT)=0 CALL RSPEAK(577) RETURN C 33100 CALL RSPSUB(301,ODI2) C !CANT WITH THAT. RETURN C C O21-- DROWNING BUTTONS C 34000 IF(PRSA.NE.PUSHW) GO TO 10 C !PUSH? GO TO (34100,34200,34300,34400),(PRSO-RBUTT+1) GO TO 10 C !NOT A BUTTON. C 34100 RFLAG(HERE)=xor(RFLAG(HERE),RLIGHT) I=230 IF(and(RFLAG(HERE),RLIGHT).NE.0) I=231 CALL RSPEAK(I) RETURN C 34200 GATEF=.TRUE. C !RELEASE GATE. CALL RSPEAK(232) RETURN C 34300 GATEF=.FALSE. C !INTERLOCK GATE. CALL RSPEAK(232) RETURN C 34400 IF(RVMNT.NE.0) GO TO 34500 C !LEAK ALREADY STARTED? CALL RSPEAK(233) C !NO, START LEAK. RVMNT=1 CTICK(CEVMNT)=-1 RETURN C 34500 CALL RSPEAK(234) C !BUTTON JAMMED. RETURN C C O22-- INFLATABLE BOAT C 36000 IF(PRSA.NE.INFLAW) GO TO 10 C !INFLATE? IF(OROOM(IBOAT).NE.0) GO TO 36100 C !IN ROOM? CALL RSPEAK(235) C !NO, JOKE. RETURN C 36100 IF(PRSI.NE.PUMP) GO TO 36200 C !WITH PUMP? CALL NEWSTA(IBOAT,0,0,0,0) C !KILL DEFL BOAT, CALL NEWSTA(RBOAT,236,HERE,0,0) C !REPL WITH INF. DEFLAF=.FALSE. RETURN C 36200 I=237 C !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 C !INFLATE? CALL RSPEAK(238) C !JOKE. RETURN C 37100 IF(PRSA.NE.PLUGW) GO TO 10 C !PLUG? IF(PRSI.NE.PUTTY) GO TO 33100 C !WITH PUTTY? CALL NEWSTA(IBOAT,239,OROOM(DBOAT),OCAN(DBOAT),OADV(DBOAT)) CALL NEWSTA(DBOAT,0,0,0,0) C !KILL DEFL BOAT, REPL. RETURN C SOBJS, PAGE 10 C C O24-- RUBBER BOAT C 38000 IF(ARG.NE.0) GO TO 10 C !DISMISS READIN, OUT. IF((PRSA.NE.BOARDW).OR.(OADV(STICK).NE.WINNER)) GO TO 38100 CALL NEWSTA(RBOAT,0,0,0,0) C !KILL INFL BOAT, CALL NEWSTA(DBOAT,240,HERE,0,0) C !REPL WITH DEAD. DEFLAF=.TRUE. RETURN C 38100 IF(PRSA.NE.INFLAW) GO TO 38200 C !INFLATE? CALL RSPEAK(367) C !YES, JOKE. RETURN C 38200 IF(PRSA.NE.DEFLAW) GO TO 10 C !DEFLATE? IF(AV.EQ.RBOAT) GO TO 38300 C !IN BOAT? IF(OROOM(RBOAT).EQ.0) GO TO 38400 C !ON GROUND? CALL NEWSTA(RBOAT,0,0,0,0) C !KILL INFL BOAT, CALL NEWSTA(IBOAT,241,HERE,0,0) C !REPL WITH DEFL. DEFLAF=.TRUE. RETURN C 38300 CALL RSPEAK(242) C !IN BOAT. RETURN C 38400 CALL RSPEAK(243) C !NOT ON GROUND. RETURN C C O25-- BRAIDED ROPE C 41000 IF((PRSA.NE.TIEW).OR.(PRSO.NE.BROPE).OR. & ((PRSI.NE.HOOK1).AND.(PRSI.NE.HOOK2))) & GO TO 41500 BTIEF=PRSI C !RECORD LOCATION. CFLAG(CEVBAL)=.FALSE. C !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 C !TIED UP? CALL RSPEAK(249) C !NO, JOKE. RETURN C 41600 CALL RSPEAK(250) BTIEF=0 C !UNTIE. CTICK(CEVBAL)=3 C !RESTART CLOCK. CFLAG(CEVBAL)=.TRUE. RETURN C C O26-- SAFE C 42000 I=0 C !ASSUME UNPROCESSED. IF(PRSA.EQ.TAKEW) I=251 C !TAKE? IF((PRSA.EQ.OPENW).AND.SAFEF) I=253 C !OPEN AFTER BLAST? IF((PRSA.EQ.OPENW).AND..NOT.SAFEF) I=254 C !OPEN BEFORE BLAST? IF((PRSA.EQ.CLOSEW).AND.SAFEF) I=253 C !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 C !BURN? CALL RSPEAK(256) CTICK(CEVFUS)=2 C !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 C !TREASURE? CALL RSPSUB(257,ODO2) C !YES, GET DOOR. CALL NEWSTA(PRSO,0,0,0,0) CALL NEWSTA(GNOME,0,0,0,0) C !VANISH GNOME. GNODRF=.TRUE. RETURN C 44100 CALL RSPSUB(258,ODO2) C !NO, LOSE OBJECT. CALL NEWSTA(PRSO,0,0,0,0) RETURN C 44500 CALL RSPEAK(259) C !NERVOUS GNOME. IF(.NOT.GNOMEF) CTICK(CEVGNO)=5 C !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) C !MUNG BOTTLES. RETURN C SOBJS, PAGE 11 C C C O30-- ROBOT C 53000 IF(PRSA.NE.GIVEW) GO TO 53200 C !GIVE? CALL NEWSTA(PRSO,0,0,0,AROBOT) C !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) C !KILL ROBOT. RETURN C C O31-- GRUE C 56000 IF(PRSA.NE.EXAMIW) GO TO 56100 C !EXAMINE? CALL RSPEAK(288) RETURN C 56100 IF(PRSA.NE.FINDW) GO TO 10 C !FIND? CALL RSPEAK(289) RETURN C END