C SOBJS- SIMPLE OBJECTS PROCESSOR
C OBJECTS IN THIS MODULE CANNOT CALL RMINFO, JIGSUP,
C MAJOR VERBS, OR OTHER NON-RESIDENT SUBROUTINES
C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
C WRITTEN BY R. M. SUPNIK
LOGICAL FUNCTION SOBJS(RI,ARG)
LOGICAL MOVETO,OPNCLS,LIT
QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
5 IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
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,
C RETURN HERE TO DECLARE FALSE RESULT
1000 IF(OCAN(GUNK).EQ.0) GO TO 10
CALL NEWSTA(GUNK,122,0,0,0)
3000 IF(PRSA.NE.TAKEW) GO TO 10
4000 IF(PRSA.NE.THROWW) GO TO 4100
CALL NEWSTA(PRSO,129,0,0,0)
4100 IF(PRSA.NE.MUNGW) GO TO 10
CALL NEWSTA(PRSO,131,0,0,0)
6000 IF(HERE.EQ.DOME) GO TO 6100
IF(PRSA.NE.UNTIEW) GO TO 6050
6050 IF(PRSA.NE.TIEW) GO TO 10
6100 IF((PRSA.NE.TIEW).OR.(PRSI.NE.RAILI)) GO TO 6200
OFLAG1(ROPE)=or(OFLAG1(ROPE),NDSCBT)
OFLAG2(ROPE)=or(OFLAG2(ROPE),CLMBBT)
CALL NEWSTA(ROPE,137,DOME,0,0)
6200 IF(PRSA.NE.UNTIEW) GO TO 6300
OFLAG1(ROPE)=and(OFLAG1(ROPE), not(NDSCBT))
OFLAG2(ROPE)=and(OFLAG2(ROPE), not(CLMBBT))
6300 IF(DOMEF.OR.(PRSA.NE.DROPW)) GO TO 6400
CALL NEWSTA(ROPE,140,MTORC,0,0)
6400 IF((PRSA.NE.TAKEW).OR. .NOT.DOMEF) GO TO 10
7000 IF((PRSA.EQ.TAKEW).AND.(WINNER.EQ.PLAYER))
8000 IF(PRSA.NE.THROWW) GO TO 8100
CALL NEWSTA(LAMP,0,0,0,0)
CALL NEWSTA(BLAMP,142,HERE,0,0)
8100 IF(PRSA.EQ.TRNONW) CFLAG(CEVLNT)=.TRUE.
IF(PRSA.EQ.TRNOFW) CFLAG(CEVLNT)=.FALSE.
9000 IF(PRSA.NE.RAISEW) GO TO 9100
9100 IF(PRSA.NE.TAKEW) GO TO 9200
9200 IF(PRSA.NE.MOVEW) GO TO 9300
OFLAG1(DOOR)=or(OFLAG1(DOOR),VISIBT)
9300 IF((PRSA.NE.LOOKUW).OR.(ORRUG.NE.0).OR.
13000 I=ROBRM(HERE,100,LLD2,0,0)+ROBADV(WINNER,LLD2,0,0)
IF(I.NE.0) CALL RSPEAK(162)
14000 IF(MIRRMF.OR.(PRSA.NE.RUBW)) GO TO 14500
IF(OROOM(I).EQ.HERE) OROOM(I)=-1
IF(OROOM(I).EQ.MROOM) OROOM(I)=HERE
IF(OROOM(I).EQ.-1) OROOM(I)=MROOM
14500 IF((PRSA.NE.LOOKW).AND.(PRSA.NE.LOOKIW).AND.
& (PRSA.NE.EXAMIW)) GO TO 14600
14600 IF(PRSA.NE.TAKEW) GO TO 14700
14700 IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
C !MIRROR ALREADY BROKEN.
16000 IF(PRSA.NE.RAISEW) GO TO 16100
CALL NEWSTA(TBASK,175,TSHAF,0,0)
CALL NEWSTA(FBASK,0,BSHAF,0,0)
16100 IF(PRSA.NE.LOWERW) GO TO 16200
IF(.NOT.CAGETF) GO TO 16400
CALL NEWSTA(TBASK,176,BSHAF,0,0)
CALL NEWSTA(FBASK,0,TSHAF,0,0)
IF(.NOT.LIT(HERE)) CALL RSPEAK(406)
16200 IF((PRSO.NE.FBASK).AND.(PRSI.NE.FBASK)) GO TO 16300
16300 IF(PRSA.NE.TAKEW) GO TO 10
16400 CALL RSPEAK(125+RND(3))
21000 IF((PRSA.NE.PUTW).OR.(PRSI.NE.TUBE)) GO TO 10
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.
24000 IF(PRSA.NE.MUNGW) GO TO 10
27000 IF(PRSA.NE.TURNW) GO TO 10
IF(PRSI.NE.WRENC) GO TO 27500
27100 IF(LWTIDF) GO TO 27200
OFLAG2(COFFI)=and(OFLAG2(COFFI), not(SCRDBT))
OFLAG1(TRUNK)=or(OFLAG1(TRUNK),VISIBT)
RFLAG(RESER)=and(or(RFLAG(RESER),RLAND)
& OFLAG1(TRUNK)=and(OFLAG1(TRUNK), not(VISIBT))
RFLAG(RESER)=and(or(RFLAG(RESER),RWATER) ,not(RLAND))
27500 CALL RSPSUB(299,ODI2)
28000 IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 10
C !UNLOCKED, VIEW FRM CLR.
SOBJS=OPNCLS(GRATE,I,885)
RFLAG(MGRAT)=and(RFLAG(MGRAT), not(RLIGHT))
IF(QOPEN(GRATE)) RFLAG(MGRAT)=or(RFLAG(MGRAT),RLIGHT)
IF(.NOT.LIT(HERE)) CALL RSPEAK(406)
29000 IF(HERE.NE.LROOM) GO TO 29100
SOBJS=OPNCLS(DOOR,218,219)
29100 IF(HERE.NE.CELLA) GO TO 10
IF((PRSA.NE.OPENW).OR.QOPEN(DOOR)) GO TO 29200
C !CANT OPEN CLOSED DOOR.
29200 SOBJS=OPNCLS(DOOR,0,22)
IF(PRSA.EQ.MUNGW) I=223+RND(3)
31000 IF(PRSA.NE.TURNW) GO TO 10
IF(PRSI.NE.SCREW) GO TO 31500
IF(QOPEN(MACHI)) GO TO 31600
IF(OCAN(COAL).NE.MACHI) GO TO 31400
CALL NEWSTA(COAL,0,0,0,0)
CALL NEWSTA(DIAMO,0,0,MACHI,0)
IF(OCAN(I).NE.MACHI) GO TO 31450
C !KILL OBJECT AND CONTENTS.
CALL NEWSTA(GUNK,0,0,MACHI,0)
31500 CALL RSPSUB(300,ODI2)
33000 IF((PRSO.NE.LEAK).OR.(PRSA.NE.PLUGW).OR.(RVMNT.LE.0))
IF(PRSI.NE.PUTTY) GO TO 33100
33100 CALL RSPSUB(301,ODI2)
34000 IF(PRSA.NE.PUSHW) GO TO 10
GO TO (34100,34200,34300,34400),(PRSO-RBUTT+1)
34100 RFLAG(HERE)=xor(RFLAG(HERE),RLIGHT)
IF(and(RFLAG(HERE),RLIGHT).NE.0) I=231
34400 IF(RVMNT.NE.0) GO TO 34500
36000 IF(PRSA.NE.INFLAW) GO TO 10
IF(OROOM(IBOAT).NE.0) GO TO 36100
36100 IF(PRSI.NE.PUMP) GO TO 36200
CALL NEWSTA(IBOAT,0,0,0,0)
CALL NEWSTA(RBOAT,236,HERE,0,0)
37000 IF(PRSA.NE.INFLAW) GO TO 37100
37100 IF(PRSA.NE.PLUGW) GO TO 10
IF(PRSI.NE.PUTTY) GO TO 33100
CALL NEWSTA(IBOAT,239,OROOM(DBOAT),OCAN(DBOAT),OADV(DBOAT))
CALL NEWSTA(DBOAT,0,0,0,0)
38000 IF(ARG.NE.0) GO TO 10
IF((PRSA.NE.BOARDW).OR.(OADV(STICK).NE.WINNER)) GO TO 38100
CALL NEWSTA(RBOAT,0,0,0,0)
CALL NEWSTA(DBOAT,240,HERE,0,0)
38100 IF(PRSA.NE.INFLAW) GO TO 38200
38200 IF(PRSA.NE.DEFLAW) GO TO 10
IF(AV.EQ.RBOAT) GO TO 38300
IF(OROOM(RBOAT).EQ.0) GO TO 38400
CALL NEWSTA(RBOAT,0,0,0,0)
CALL NEWSTA(IBOAT,241,HERE,0,0)
41000 IF((PRSA.NE.TIEW).OR.(PRSO.NE.BROPE).OR.
& ((PRSI.NE.HOOK1).AND.(PRSI.NE.HOOK2)))
41500 IF((PRSA.NE.UNTIEW).OR.(PRSO.NE.BROPE)) GO TO 10
IF(BTIEF.NE.0) GO TO 41600
IF((PRSA.EQ.OPENW).AND.SAFEF) I=253
IF((PRSA.EQ.OPENW).AND..NOT.SAFEF) I=254
IF((PRSA.EQ.CLOSEW).AND.SAFEF) I=253
IF((PRSA.EQ.CLOSEW).AND..NOT.SAFEF) I=255
43000 IF(PRSA.NE.BURNW) GO TO 10
44000 IF((PRSA.NE.GIVEW).AND.(PRSA.NE.THROWW)) GO TO 44500
IF(OTVAL(PRSO).EQ.0) GO TO 44100
CALL NEWSTA(PRSO,0,0,0,0)
CALL NEWSTA(GNOME,0,0,0,0)
44100 CALL RSPSUB(258,ODO2)
CALL NEWSTA(PRSO,0,0,0,0)
IF(.NOT.GNOMEF) CTICK(CEVGNO)=5
46000 IF((PRSA.NE.THROWW).AND.(PRSA.NE.MUNGW)) GO TO 10
CALL NEWSTA(PRSO,262,0,0,0)
53000 IF(PRSA.NE.GIVEW) GO TO 53200
CALL NEWSTA(PRSO,0,0,0,AROBOT)
53200 IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
CALL NEWSTA(ROBOT,285,0,0,0)
56000 IF(PRSA.NE.EXAMIW) GO TO 56100
56100 IF(PRSA.NE.FINDW) GO TO 10