home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol047 / sobjs.for < prev    next >
Encoding:
Text File  |  1984-04-29  |  17.7 KB  |  672 lines

  1. C SOBJS-    SIMPLE OBJECTS PROCESSOR
  2. C    OBJECTS IN THIS MODULE CANNOT CALL RMINFO, JIGSUP,
  3. C    MAJOR VERBS, OR OTHER NON-RESIDENT SUBROUTINES
  4. C
  5. C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
  6. C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
  7. C WRITTEN BY R. M. SUPNIK
  8. C
  9. C DECLARATIONS
  10. C
  11.     LOGICAL FUNCTION SOBJS(RI,ARG)
  12.     IMPLICIT INTEGER (A-Z)
  13.     LOGICAL QOPEN
  14.     LOGICAL MOVETO,OPNCLS,LIT
  15.     LOGICAL QHERE,F
  16. C
  17. C PARSER OUTPUT
  18. C
  19.     LOGICAL PRSWON
  20.     COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
  21. C
  22. C GAME STATE
  23. C
  24.     LOGICAL TELFLG
  25.     COMMON /PLAY/ WINNER,HERE,TELFLG
  26.     COMMON /STATE/ MOVES,DEATHS,RWSCOR,MXSCOR,MXLOAD,
  27.     1    LTSHFT,BLOC,MUNGRM,HS,EGSCOR,EGMXSC
  28. C
  29. C ROOMS
  30. C
  31.     COMMON /ROOMS/ RLNT,RDESC2,RDESC1(200),REXIT(200),
  32.     1    RACTIO(200),RVAL(200),RFLAG(200)
  33.     INTEGER RRAND(200)
  34.     EQUIVALENCE (RVAL,RRAND)
  35. C
  36.     COMMON /RFLAG/ RSEEN,RLIGHT,RLAND,RWATER,RAIR,
  37.     1    RSACRD,RFILL,RMUNG,RBUCK,RHOUSE,RNWALL,REND
  38. C
  39.     COMMON /RINDEX/ WHOUS,LROOM,CELLA
  40.     COMMON /RINDEX/ MTROL,MAZE1    
  41.     COMMON /RINDEX/ MGRAT,MAZ15    
  42.     COMMON /RINDEX/ FORE1,FORE3,CLEAR,RESER
  43.     COMMON /RINDEX/ STREA,EGYPT,ECHOR
  44.     COMMON /RINDEX/ TSHAF    
  45.     COMMON /RINDEX/ BSHAF,MMACH,DOME,MTORC
  46.     COMMON /RINDEX/ CAROU    
  47.     COMMON /RINDEX/ RIDDL,LLD2,TEMP1,TEMP2,MAINT
  48.     COMMON /RINDEX/ BLROO,TREAS,RIVR1,RIVR2,RIVR3,MCYCL
  49.     COMMON /RINDEX/ RIVR4,RIVR5,FCHMP,FALLS,MBARR
  50.     COMMON /RINDEX/ MRAIN,POG,VLBOT,VAIR1,VAIR2,VAIR3,VAIR4
  51.     COMMON /RINDEX/ LEDG2,LEDG3,LEDG4,MSAFE,CAGER
  52.     COMMON /RINDEX/ CAGED,TWELL,BWELL,ALICE,ALISM,ALITR
  53.     COMMON /RINDEX/ MTREE,BKENT,BKVW,BKTWI,BKVAU,BKBOX
  54.     COMMON /RINDEX/ CRYPT,TSTRS,MRANT,MREYE
  55.     COMMON /RINDEX/ MRA,MRB,MRC,MRG,MRD,FDOOR
  56.     COMMON /RINDEX/ MRAE,MRCE,MRCW,MRGE,MRGW,MRDW,INMIR
  57.     COMMON /RINDEX/ SCORR,NCORR,PARAP,CELL,PCELL,NCELL
  58.     COMMON /RINDEX/ CPANT,CPOUT,CPUZZ
  59. C
  60. C OBJECTS
  61. C
  62.     COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220),
  63.     1    OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220),
  64.     2    OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220),
  65.     3    OADV(220),OCAN(220),OREAD(220)
  66. C
  67.     COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
  68.     1    NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
  69.     2    TOOLBT,TURNBT,ONBT
  70.     COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
  71.     1    WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
  72.     2    TCHBT,VEHBT,SCHBT
  73. C
  74.     COMMON /OINDEX/ GARLI,FOOD,GUNK,COAL,MACHI,DIAMO,TCASE,BOTTL
  75.     COMMON /OINDEX/ WATER,ROPE,KNIFE,SWORD,LAMP,BLAMP,RUG
  76.     COMMON /OINDEX/    LEAVE,TROLL,AXE
  77.     COMMON /OINDEX/ RKNIF,KEYS,ICE,BAR
  78.     COMMON /OINDEX/ COFFI,TORCH,TBASK,FBASK,IRBOX
  79.     COMMON /OINDEX/ GHOST,TRUNK,BELL,BOOK,CANDL
  80.     COMMON /OINDEX/ MATCH,TUBE,PUTTY,WRENC,SCREW,CYCLO,CHALI
  81.     COMMON /OINDEX/ THIEF,STILL,WINDO,GRATE,DOOR
  82.     COMMON /OINDEX/ HPOLE,LEAK,RBUTT,RAILI
  83.     COMMON /OINDEX/ POT,STATU,IBOAT,DBOAT,PUMP,RBOAT
  84.     COMMON /OINDEX/ STICK,BUOY,SHOVE,BALLO,RECEP,GUANO
  85.     COMMON /OINDEX/ BROPE,HOOK1,HOOK2,SAFE,SSLOT,BRICK,FUSE
  86.     COMMON /OINDEX/ GNOME,BLABE,DBALL,TOMB
  87.     COMMON /OINDEX/ LCASE,CAGE,RCAGE,SPHER,SQBUT
  88.     COMMON /OINDEX/ FLASK,POOL,SAFFR,BUCKE,ECAKE,ORICE,RDICE,BLICE
  89.     COMMON /OINDEX/ ROBOT,FTREE,BILLS,PORTR,SCOL,ZGNOM
  90.     COMMON /OINDEX/ EGG,BEGG,BAUBL,CANAR,BCANA
  91.     COMMON /OINDEX/ YLWAL,RDWAL,PINDR,RBEAM
  92.     COMMON /OINDEX/ ODOOR,QDOOR,CDOOR,NUM1,NUM8
  93.     COMMON /OINDEX/ WARNI,CSLIT,GCARD,STLDR
  94.     COMMON /OINDEX/ HANDS,WALL,LUNGS,SAILO,AVIAT,TEETH
  95.     COMMON /OINDEX/ ITOBJ,EVERY,VALUA,OPLAY,WNORT,GWATE,MASTER
  96. C
  97. C CLOCK INTERRUPTS
  98. C
  99.     LOGICAL*1 CFLAG
  100.     COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25)
  101. C
  102.     COMMON /CINDEX/ CEVCUR,CEVMNT,CEVLNT,CEVMAT,CEVCND,
  103.     1    CEVBAL,CEVBRN,CEVFUS,CEVLED,CEVSAF,CEVVLG,
  104.     2    CEVGNO,CEVBUC,CEVSPH,CEVEGH,
  105.     3    CEVFOR,CEVSCL,CEVZGI,CEVZGO,CEVSTE,
  106.     5    CEVMRS,CEVPIN,CEVINQ,CEVFOL
  107.  
  108. C
  109. C VILLAINS AND DEMONS
  110. C
  111.     LOGICAL THFFLG,SWDACT,THFACT
  112.     COMMON /HACK/ THFPOS,THFFLG,THFACT,SWDACT,SWDSTA
  113. C
  114. C ADVENTURERS
  115. C
  116.     COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
  117.     1    AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
  118. C
  119.     COMMON /AINDEX/ PLAYER,AROBOT,AMASTR
  120. C
  121. C VERBS
  122. C
  123.     COMMON /VINDEX/ CINTW,DEADXW,FRSTQW,INXW,OUTXW
  124.     COMMON /VINDEX/ WALKIW,FIGHTW,FOOW
  125.     COMMON /VINDEX/ MELTW,READW,INFLAW,DEFLAW,ALARMW,EXORCW
  126.     COMMON /VINDEX/ PLUGW,KICKW,WAVEW,RAISEW,LOWERW,RUBW
  127.     COMMON /VINDEX/ PUSHW,UNTIEW,TIEW,TIEUPW,TURNW,BREATW
  128.     COMMON /VINDEX/ KNOCKW,LOOKW,EXAMIW,SHAKEW,MOVEW,TRNONW,TRNOFW
  129.     COMMON /VINDEX/ OPENW,CLOSEW,FINDW,WAITW,SPINW,BOARDW,UNBOAW,TAKEW
  130.     COMMON /VINDEX/ INVENW,FILLW,EATW,DRINKW,BURNW
  131.     COMMON /VINDEX/ MUNGW,KILLW,ATTACW,SWINGW
  132.     COMMON /VINDEX/ WALKW,TELLW,PUTW,DROPW,GIVEW,POURW,THROWW
  133.     COMMON /VINDEX/ DIGW,LEAPW,STAYW,FOLLOW
  134.     COMMON /VINDEX/ HELLOW,LOOKIW,LOOKUW,PUMPW,WINDW
  135.     COMMON /VINDEX/ CLMBW,CLMBUW,CLMBDW,TRNTOW
  136. C
  137. C FLAGS
  138. C
  139.     LOGICAL*1 TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF
  140.     LOGICAL*1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF
  141.     LOGICAL*1 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF
  142.     LOGICAL*1 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF
  143.     LOGICAL*1 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF
  144.     LOGICAL*1 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF
  145.     LOGICAL*1 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF
  146.     LOGICAL*1 FOLLWF,SPELLF,CPOUTF,CPUSHF
  147.     COMMON /FINDEX/ TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF,
  148.     1    DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF,
  149.     2    MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF,
  150.     3    EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF,
  151.     4    GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF,
  152.     5    GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF,
  153.     6    MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF,
  154.     7    FOLLWF,SPELLF,CPOUTF,CPUSHF
  155.     COMMON /FINDEX/ BTIEF,BINFF
  156.     COMMON /FINDEX/ RVMNT,RVCLR,RVCYC,RVSND,RVGUA
  157.     COMMON /FINDEX/ ORRUG,ORCAND,ORMTCH,ORLAMP
  158.     COMMON /FINDEX/ MDIR,MLOC,POLEUF
  159.     COMMON /FINDEX/ QUESNO,NQATT,CORRCT
  160.     COMMON /FINDEX/ LCELL,PNUMB,ACELL,DCELL,CPHERE
  161. C
  162. C FUNCTIONS AND DATA
  163. C
  164.     QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
  165. C SOBJS, PAGE 2
  166. C
  167.     IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
  168.     IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  169.     AV=AVEHIC(WINNER)
  170.     SOBJS=.TRUE.
  171. C
  172.     GO TO (1000,3000,4000,6000,7000,8000,9000,
  173.     1 13000,14000,16000,17000,
  174.     2 21000,23000,24000,27000,28000,29000,30000,
  175.     3 31000,33000,34000,36000,37000,38000,
  176.     4 41000,42000,43000,44000,46000,
  177.     5 53000,56000)
  178.     6    RI
  179.     CALL BUG(6,RI)
  180. C
  181. C RETURN HERE TO DECLARE FALSE RESULT
  182. C
  183. 10    SOBJS=.FALSE.
  184.     RETURN
  185. C SOBJS, PAGE 3
  186. C
  187. C O1--    GUNK FUNCTION
  188. C
  189. 1000    IF(OCAN(GUNK).EQ.0) GO TO 10        !NOT INSIDE? F
  190.     CALL NEWSTA(GUNK,122,0,0,0)        !FALLS APART.
  191.     RETURN
  192. C
  193. C O2--    TROPHY CASE
  194. C
  195. 3000    IF(PRSA.NE.TAKEW) GO TO 10        !TAKE?
  196.     CALL RSPEAK(128)            !CANT.
  197.     RETURN
  198. C
  199. C O3--    BOTTLE FUNCTION
  200. C
  201. 4000    IF(PRSA.NE.THROWW) GO TO 4100        !THROW?
  202.     CALL NEWSTA(PRSO,129,0,0,0)        !BREAKS.
  203.     RETURN
  204. C
  205. 4100    IF(PRSA.NE.MUNGW) GO TO 10        !MUNG?
  206.     CALL NEWSTA(PRSO,131,0,0,0)        !BREAKS.
  207.     RETURN
  208. C SOBJS, PAGE 4
  209. C
  210. C O4--    ROPE FUNCTION
  211. C
  212. 6000    IF(HERE.EQ.DOME) GO TO 6100        !IN DOME?
  213.     DOMEF=.FALSE.                !NO,
  214.     IF(PRSA.NE.UNTIEW) GO TO 6050        !UNTIE?
  215.     CALL RSPEAK(134)            !CANT
  216.     RETURN
  217. C
  218. 6050    IF(PRSA.NE.TIEW) GO TO 10        !TIE?
  219.     CALL RSPEAK(135)            !CANT TIE
  220.     RETURN
  221. C
  222. 6100    IF((PRSA.NE.TIEW).OR.(PRSI.NE.RAILI)) GO TO 6200
  223.     IF(DOMEF) GO TO 6150            !ALREADY TIED?
  224.     DOMEF=.TRUE.                !NO, TIE IT.
  225.     OFLAG1(ROPE)=OFLAG1(ROPE).OR.NDSCBT
  226.     OFLAG2(ROPE)=OFLAG2(ROPE).OR.CLMBBT
  227.     CALL NEWSTA(ROPE,137,DOME,0,0)
  228.     RETURN
  229. C
  230. 6150    CALL RSPEAK(136)            !DUMMY.
  231.     RETURN
  232. C
  233. 6200    IF(PRSA.NE.UNTIEW) GO TO 6300        !UNTIE?
  234.     IF(DOMEF) GO TO 6250            !TIED?
  235.     CALL RSPEAK(134)            !NO, DUMMY.
  236.     RETURN
  237. C
  238. 6250    DOMEF=.FALSE.                !YES, UNTIE IT.
  239.     OFLAG1(ROPE)=OFLAG1(ROPE).AND. .NOT.NDSCBT
  240.     OFLAG2(ROPE)=OFLAG2(ROPE).AND. .NOT.CLMBBT
  241.     CALL RSPEAK(139)
  242.     RETURN
  243. C
  244. 6300    IF(DOMEF.OR.(PRSA.NE.DROPW)) GO TO 6400    !DROP & UNTIED?
  245.     CALL NEWSTA(ROPE,140,MTORC,0,0)        !YES, DROP.
  246.     RETURN
  247. C
  248. 6400    IF((PRSA.NE.TAKEW).OR. .NOT.DOMEF) GO TO 10
  249.     CALL RSPEAK(141)            !TAKE & TIED.
  250.     RETURN
  251. C
  252. C O5--    SWORD FUNCTION
  253. C
  254. 7000    IF((PRSA.EQ.TAKEW).AND.(WINNER.EQ.PLAYER))
  255.     1    SWDACT=.TRUE.            !TURN ON DEMON.
  256.     GO TO 10
  257. C
  258. C O6--    LANTERN
  259. C
  260. 8000    IF(PRSA.NE.THROWW) GO TO 8100        !THROW?
  261.     CALL NEWSTA(LAMP,0,0,0,0)        !KILL LAMP,
  262.     CALL NEWSTA(BLAMP,142,HERE,0,0)        !REPLACE WITH BROKEN.
  263.     RETURN
  264. C
  265. 8100    IF(PRSA.EQ.TRNONW) CFLAG(CEVLNT)=.TRUE.
  266.     IF(PRSA.EQ.TRNOFW) CFLAG(CEVLNT)=.FALSE.
  267.     GO TO 10
  268. C
  269. C O7--    RUG FUNCTION
  270. C
  271. 9000    IF(PRSA.NE.RAISEW) GO TO 9100        !RAISE?
  272.     CALL RSPEAK(143)            !CANT
  273.     RETURN
  274. C
  275. 9100    IF(PRSA.NE.TAKEW) GO TO 9200        !TAKE?
  276.     CALL RSPEAK(144)            !CANT
  277.     RETURN
  278. C
  279. 9200    IF(PRSA.NE.MOVEW) GO TO 9300        !MOVE?
  280.     CALL RSPEAK(145+ORRUG)
  281.     ORRUG=1
  282.     OFLAG1(DOOR)=OFLAG1(DOOR).OR.VISIBT    !REVEAL DOOR.
  283.     RETURN
  284. C
  285. 9300    IF((PRSA.NE.LOOKUW).OR.(ORRUG.NE.0).OR.
  286.     1    QOPEN(DOOR)) GO TO 10        !LOOK UNDER RUG?
  287.     CALL RSPEAK(345)
  288.     RETURN
  289. C SOBJS, PAGE 5
  290. C
  291. C O8--    SKELETON
  292. C
  293. 13000    I=ROBRM(HERE,100,LLD2,0,0)+ROBADV(WINNER,LLD2,0,0)
  294.     IF(I.NE.0) CALL RSPEAK(162)        !IF ROBBED, SAY SO.
  295.     RETURN
  296. C
  297. C O9--    MIRROR
  298. C
  299. 14000    IF(MIRRMF.OR.(PRSA.NE.RUBW)) GO TO 14500
  300.     MROOM=HERE.XOR.1            !CALCULATE NEW RM.
  301.     DO 14100 I=1,OLNT            !INTERCHANGE OBJS.
  302.       IF(OROOM(I).EQ.HERE) OROOM(I)=-1
  303.       IF(OROOM(I).EQ.MROOM) OROOM(I)=HERE
  304.       IF(OROOM(I).EQ.-1) OROOM(I)=MROOM
  305. 14100    CONTINUE
  306.     F=MOVETO(MROOM,WINNER)
  307.     CALL RSPEAK(163)            !SHAKE WORLD.
  308.     RETURN
  309. C
  310. 14500    IF((PRSA.NE.LOOKW).AND.(PRSA.NE.LOOKIW).AND.
  311.     1    (PRSA.NE.EXAMIW)) GO TO 14600
  312.     I=164                    !MIRROR OK.
  313.     IF(MIRRMF) I=165            !MIRROR DEAD.
  314.     CALL RSPEAK(I)
  315.     RETURN
  316. C
  317. 14600    IF(PRSA.NE.TAKEW) GO TO 14700        !TAKE?
  318.     CALL RSPEAK(166)            !JOKE.
  319.     RETURN
  320. C
  321. 14700    IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
  322.     I=167                    !MIRROR BREAKS.
  323.     IF(MIRRMF) I=168            !MIRROR ALREADY BROKEN.
  324.     MIRRMF=.TRUE.
  325.     BADLKF=.TRUE.
  326.     CALL RSPEAK(I)
  327.     RETURN
  328. C SOBJS, PAGE 6
  329. C
  330. C O10--    DUMBWAITER
  331. C
  332. 16000    IF(PRSA.NE.RAISEW) GO TO 16100        !RAISE?
  333.     IF(CAGETF) GO TO 16400            !ALREADY AT TOP?
  334.     CALL NEWSTA(TBASK,175,TSHAF,0,0)    !NO, RAISE BASKET.
  335.     CALL NEWSTA(FBASK,0,BSHAF,0,0)
  336.     CAGETF=.TRUE.            !AT TOP.
  337.     RETURN
  338. C
  339. 16100    IF(PRSA.NE.LOWERW) GO TO 16200        !LOWER?
  340.     IF(.NOT.CAGETF) GO TO 16400        !ALREADY AT BOTTOM?
  341.     CALL NEWSTA(TBASK,176,BSHAF,0,0)    !NO, LOWER BASKET.
  342.     CALL NEWSTA(FBASK,0,TSHAF,0,0)
  343.     CAGETF=.FALSE.
  344.     IF(.NOT.LIT(HERE)) CALL RSPEAK(406)    !IF DARK, DIE.
  345.     RETURN
  346. C
  347. 16200    IF((PRSO.NE.FBASK).AND.(PRSI.NE.FBASK)) GO TO 16300
  348.     CALL RSPEAK(130)            !WRONG BASKET.
  349.     RETURN
  350. C
  351. 16300    IF(PRSA.NE.TAKEW) GO TO 10        !TAKE?
  352.     CALL RSPEAK(177)            !JOKE.
  353.     RETURN
  354. C
  355. 16400    CALL RSPEAK(125+RND(3))            !DUMMY.
  356.     RETURN
  357. C
  358. C O11--    GHOST FUNCTION
  359. C
  360. 17000    I=178                    !ASSUME DIRECT.
  361.     IF(PRSO.NE.GHOST) I=179            !IF NOT, INDIRECT.
  362.     CALL RSPEAK(I)
  363.     RETURN                    !SPEAK AND EXIT.
  364. C SOBJS, PAGE 7
  365. C
  366. C O12--    TUBE
  367. C
  368. 21000    IF((PRSA.NE.PUTW).OR.(PRSI.NE.TUBE)) GO TO 10
  369.     CALL RSPEAK(186)            !CANT PUT BACK IN.
  370.     RETURN
  371. C
  372. C O13--    CHALICE
  373. C
  374. 23000    IF((PRSA.NE.TAKEW).OR.(OCAN(PRSO).NE.0).OR.
  375.     1    (OROOM(PRSO).NE.TREAS).OR.(OROOM(THIEF).NE.TREAS).OR.
  376.     2    ((OFLAG2(THIEF).AND.FITEBT).EQ.0).OR.
  377.     3    .NOT. THFACT) GO TO 10
  378.     CALL RSPEAK(204)            !CANT TAKE.
  379.     RETURN
  380. C
  381. C O14--    PAINTING
  382. C
  383. 24000    IF(PRSA.NE.MUNGW) GO TO 10        !MUNG?
  384.     CALL RSPEAK(205)            !DESTROY PAINTING.
  385.     OFVAL(PRSO)=0
  386.     OTVAL(PRSO)=0
  387.     ODESC1(PRSO)=207
  388.     ODESC2(PRSO)=206
  389.     RETURN
  390. C SOBJS, PAGE 8
  391. C
  392. C O15--    BOLT
  393. C
  394. 27000    IF(PRSA.NE.TURNW) GO TO 10        !TURN BOLT?
  395.     IF(PRSI.NE.WRENC) GO TO 27500        !WITH WRENCH?
  396.     IF(GATEF) GO TO 27100            !PROPER BUTTON PUSHED?
  397.     CALL RSPEAK(210)            !NO, LOSE.
  398.     RETURN
  399. C
  400. 27100    IF(LWTIDF) GO TO 27200            !LOW TIDE NOW?
  401.     LWTIDF=.TRUE.                !NO, EMPTY DAM.
  402.     CALL RSPEAK(211)
  403.     OFLAG2(COFFI)=OFLAG2(COFFI).AND. .NOT.SCRDBT
  404.     OFLAG1(TRUNK)=OFLAG1(TRUNK).OR.VISIBT    !MATERIALIZE TRUNK.
  405.     RFLAG(RESER)=(RFLAG(RESER).OR.RLAND)
  406.     1    .AND..NOT.(RWATER+RSEEN)    !KEEP THIEF AWAY.
  407.     RETURN
  408. C
  409. 27200    LWTIDF=.FALSE.                !YES, FILL DAM.
  410.     CALL RSPEAK(212)
  411.     IF(QHERE(TRUNK,RESER)) OFLAG1(TRUNK)=OFLAG1(TRUNK)
  412.     1    .AND. .NOT.VISIBT
  413.     RFLAG(RESER)=(RFLAG(RESER).OR.RWATER) .AND..NOT.RLAND
  414.     RETURN
  415. C
  416. 27500    CALL RSPSUB(299,ODI2)            !NOT WITH THAT.
  417.     RETURN
  418. C
  419. C O16--    GRATING
  420. C
  421. 28000    IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 10
  422.     IF(GRUNLF) GO TO 28200            !UNLOCKED?
  423.     CALL RSPEAK(214)            !NO, LOCKED.
  424.     RETURN
  425. C
  426. 28200    I=215                    !UNLOCKED, VIEW FRM CLR.
  427.     IF(HERE.NE.CLEAR) I=216            !VIEW FROM BELOW.
  428.     SOBJS=OPNCLS(GRATE,I,885)        !OPEN/CLOSE.
  429.     RFLAG(MGRAT)=RFLAG(MGRAT).AND. .NOT.RLIGHT    !SET LIGHT/DARK.
  430.     IF(QOPEN(GRATE)) RFLAG(MGRAT)=RFLAG(MGRAT).OR.RLIGHT
  431.     IF(.NOT.LIT(HERE)) CALL RSPEAK(406)    !IF DARK, DIE.
  432.     RETURN
  433. C
  434. C O17--    TRAP DOOR
  435. C
  436. 29000    IF(HERE.NE.LROOM) GO TO 29100        !FROM LIVING ROOM?
  437.     SOBJS=OPNCLS(DOOR,218,219)        !OPEN/CLOSE.
  438.     RETURN
  439. C
  440. 29100    IF(HERE.NE.CELLA) GO TO 10        !FROM CELLAR?
  441.     IF((PRSA.NE.OPENW).OR.QOPEN(DOOR)) GO TO 29200
  442.     CALL RSPEAK(220)            !CANT OPEN CLOSED DOOR.
  443.     RETURN
  444. C
  445. 29200    SOBJS=OPNCLS(DOOR,0,22)            !NORMAL OPEN/CLOSE.
  446.     RETURN
  447. C
  448. C O18--    DURABLE DOOR
  449. C
  450. 30000    I=0                    !ASSUME NO APPL.
  451.     IF(PRSA.EQ.OPENW) I=221            !OPEN?
  452.     IF(PRSA.EQ.BURNW) I=222            !BURN?
  453.     IF(PRSA.EQ.MUNGW) I=223+RND(3)        !MUNG?
  454.     IF(I.EQ.0) GO TO 10
  455.     CALL RSPEAK(I)
  456.     RETURN
  457. C
  458. C O19--    MASTER SWITCH
  459. C
  460. 31000    IF(PRSA.NE.TURNW) GO TO 10        !TURN?
  461.     IF(PRSI.NE.SCREW) GO TO 31500        !WITH SCREWDRIVER?
  462.     IF(QOPEN(MACHI)) GO TO 31600        !LID UP?
  463.     CALL RSPEAK(226)            !NO, ACTIVATE.
  464.     IF(OCAN(COAL).NE.MACHI) GO TO 31400    !COAL INSIDE?
  465.     CALL NEWSTA(COAL,0,0,0,0)        !KILL COAL,
  466.     CALL NEWSTA(DIAMO,0,0,MACHI,0)        !REPLACE WITH DIAMOND.
  467.     RETURN
  468. C
  469. 31400    DO 31450 I=1,OLNT            !KILL NONCOAL OBJECTS.
  470.       IF(OCAN(I).NE.MACHI) GO TO 31450    !INSIDE MACHINE?
  471.       CALL NEWSTA(I,0,0,0,0)        !KILL OBJECT AND CONTENTS.
  472.       CALL NEWSTA(GUNK,0,0,MACHI,0)        !REDUCE TO GUNK.
  473. 31450    CONTINUE
  474.     RETURN
  475. C
  476. 31500    CALL RSPSUB(300,ODI2)            !CANT TURN WITH THAT.
  477.     RETURN
  478. C
  479. 31600    CALL RSPEAK(227)            !LID IS UP.
  480.     RETURN
  481. C SOBJS, PAGE 9
  482. C
  483. C O20--    LEAK
  484. C
  485. 33000    IF((PRSO.NE.LEAK).OR.(PRSA.NE.PLUGW).OR.(RVMNT.LE.0))
  486.     1    GO TO 10            !PLUG ACTIVE LEAK?
  487.     IF(PRSI.NE.PUTTY) GO TO 33100        !WITH PUTTY?
  488.     RVMNT=-1                !DISABLE LEAK.
  489.     CTICK(CEVMNT)=0
  490.     CALL RSPEAK(577)
  491.     RETURN
  492. C
  493. 33100    CALL RSPSUB(301,ODI2)            !CANT WITH THAT.
  494.     RETURN
  495. C
  496. C O21--    DROWNING BUTTONS
  497. C
  498. 34000    IF(PRSA.NE.PUSHW) GO TO 10        !PUSH?
  499.     GO TO (34100,34200,34300,34400),(PRSO-RBUTT+1)
  500.     GO TO 10                !NOT A BUTTON.
  501. C
  502. 34100    RFLAG(HERE)=RFLAG(HERE).XOR.RLIGHT    !RED, ZAP LIGHTS.
  503.     I=230
  504.     IF((RFLAG(HERE).AND.RLIGHT).NE.0) I=231
  505.     CALL RSPEAK(I)
  506.     RETURN
  507. C
  508. 34200    GATEF=.TRUE.                !RELEASE GATE.
  509.     CALL RSPEAK(232)
  510.     RETURN
  511. C
  512. 34300    GATEF=.FALSE.                !INTERLOCK GATE.
  513.     CALL RSPEAK(232)
  514.     RETURN
  515. C
  516. 34400    IF(RVMNT.NE.0) GO TO 34500        !LEAK ALREADY STARTED?
  517.     CALL RSPEAK(233)            !NO, START LEAK.
  518.     RVMNT=1
  519.     CTICK(CEVMNT)=-1
  520.     RETURN
  521. C
  522. 34500    CALL RSPEAK(234)            !BUTTON JAMMED.
  523.     RETURN
  524. C
  525. C O22--    INFLATABLE BOAT
  526. C
  527. 36000    IF(PRSA.NE.INFLAW) GO TO 10        !INFLATE?
  528.     IF(OROOM(IBOAT).NE.0) GO TO 36100    !IN ROOM?
  529.     CALL RSPEAK(235)            !NO, JOKE.
  530.     RETURN
  531. C
  532. 36100    IF(PRSI.NE.PUMP) GO TO 36200        !WITH PUMP?
  533.     CALL NEWSTA(IBOAT,0,0,0,0)        !KILL DEFL BOAT,
  534.     CALL NEWSTA(RBOAT,236,HERE,0,0)        !REPL WITH INF.
  535.     DEFLAF=.FALSE.
  536.     RETURN
  537. C
  538. 36200    I=237                    !JOKES.
  539.     IF(PRSI.NE.LUNGS) I=303
  540.     CALL RSPSUB(I,ODI2)
  541.     RETURN
  542. C
  543. C O23--    DEFLATED BOAT
  544. C
  545. 37000    IF(PRSA.NE.INFLAW) GO TO 37100        !INFLATE?
  546.     CALL RSPEAK(238)            !JOKE.
  547.     RETURN
  548. C
  549. 37100    IF(PRSA.NE.PLUGW) GO TO 10        !PLUG?
  550.     IF(PRSI.NE.PUTTY) GO TO 33100        !WITH PUTTY?
  551.     CALL NEWSTA(IBOAT,239,OROOM(DBOAT),OCAN(DBOAT),OADV(DBOAT))
  552.     CALL NEWSTA(DBOAT,0,0,0,0)        !KILL DEFL BOAT, REPL.
  553.     RETURN
  554. C SOBJS, PAGE 10
  555. C
  556. C O24--    RUBBER BOAT
  557. C
  558. 38000    IF(ARG.NE.0) GO TO 10            !DISMISS READIN, OUT.
  559.     IF((PRSA.NE.BOARDW).OR.(OADV(STICK).NE.WINNER)) GO TO 38100
  560.     CALL NEWSTA(RBOAT,0,0,0,0)        !KILL INFL BOAT,
  561.     CALL NEWSTA(DBOAT,240,HERE,0,0)        !REPL WITH DEAD.
  562.     DEFLAF=.TRUE.
  563.     RETURN
  564. C
  565. 38100    IF(PRSA.NE.INFLAW) GO TO 38200        !INFLATE?
  566.     CALL RSPEAK(367)            !YES, JOKE.
  567.     RETURN
  568. C
  569. 38200    IF(PRSA.NE.DEFLAW) GO TO 10        !DEFLATE?
  570.     IF(AV.EQ.RBOAT) GO TO 38300        !IN BOAT?
  571.     IF(OROOM(RBOAT).EQ.0) GO TO 38400    !ON GROUND?
  572.     CALL NEWSTA(RBOAT,0,0,0,0)        !KILL INFL BOAT,
  573.     CALL NEWSTA(IBOAT,241,HERE,0,0)        !REPL WITH DEFL.
  574.     DEFLAF=.TRUE.
  575.     RETURN
  576. C
  577. 38300    CALL RSPEAK(242)            !IN BOAT.
  578.     RETURN
  579. C
  580. 38400    CALL RSPEAK(243)            !NOT ON GROUND.
  581.     RETURN
  582. C
  583. C O25--    BRAIDED ROPE
  584. C
  585. 41000    IF((PRSA.NE.TIEW).OR.(PRSO.NE.BROPE).OR.
  586.     1    ((PRSI.NE.HOOK1).AND.(PRSI.NE.HOOK2)))
  587.     2    GO TO 41500            !TIE TO HOOK?
  588.     BTIEF=PRSI                !RECORD LOCATION.
  589.     CFLAG(CEVBAL)=.FALSE.            !STALL ASCENT.
  590.     CALL RSPEAK(248)
  591.     RETURN
  592. C
  593. 41500    IF((PRSA.NE.UNTIEW).OR.(PRSO.NE.BROPE)) GO TO 10
  594.     IF(BTIEF.NE.0) GO TO 41600        !TIED UP?
  595.     CALL RSPEAK(249)            !NO, JOKE.
  596.     RETURN
  597. C
  598. 41600    CALL RSPEAK(250)
  599.     BTIEF=0                    !UNTIE.
  600.     CTICK(CEVBAL)=3                !RESTART CLOCK.
  601.     CFLAG(CEVBAL)=.TRUE.
  602.     RETURN
  603. C
  604. C O26--    SAFE
  605. C
  606. 42000    I=0                    !ASSUME UNPROCESSED.
  607.     IF(PRSA.EQ.TAKEW) I=251            !TAKE?
  608.     IF((PRSA.EQ.OPENW).AND.SAFEF) I=253    !OPEN AFTER BLAST?
  609.     IF((PRSA.EQ.OPENW).AND..NOT.SAFEF) I=254 !OPEN BEFORE BLAST?
  610.     IF((PRSA.EQ.CLOSEW).AND.SAFEF) I=253    !CLOSE AFTER?
  611.     IF((PRSA.EQ.CLOSEW).AND..NOT.SAFEF) I=255
  612.     IF(I.EQ.0) GO TO 10
  613.     CALL RSPEAK(I)
  614.     RETURN
  615. C
  616. C O27--    FUSE
  617. C
  618. 43000    IF(PRSA.NE.BURNW) GO TO 10        !BURN?
  619.     CALL RSPEAK(256)
  620.     CTICK(CEVFUS)=2                !START COUNTDOWN.
  621.     RETURN
  622. C
  623. C O28--    GNOME
  624. C
  625. 44000    IF((PRSA.NE.GIVEW).AND.(PRSA.NE.THROWW)) GO TO 44500
  626.     IF(OTVAL(PRSO).EQ.0) GO TO 44100    !TREASURE?
  627.     CALL RSPSUB(257,ODO2)            !YES, GET DOOR.
  628.     CALL NEWSTA(PRSO,0,0,0,0)
  629.     CALL NEWSTA(GNOME,0,0,0,0)        !VANISH GNOME.
  630.     GNODRF=.TRUE.
  631.     RETURN
  632. C
  633. 44100    CALL RSPSUB(258,ODO2)            !NO, LOSE OBJECT.
  634.     CALL NEWSTA(PRSO,0,0,0,0)
  635.     RETURN
  636. C
  637. 44500    CALL RSPEAK(259)            !NERVOUS GNOME.
  638.     IF(.NOT.GNOMEF) CTICK(CEVGNO)=5        !SCHEDULE BYEBYE.
  639.     GNOMEF=.TRUE.
  640.     RETURN
  641. C
  642. C O29--    COKE BOTTLES
  643. C
  644. 46000    IF((PRSA.NE.THROWW).AND.(PRSA.NE.MUNGW)) GO TO 10
  645.     CALL NEWSTA(PRSO,262,0,0,0)        !MUNG BOTTLES.
  646.     RETURN
  647. C SOBJS, PAGE 11
  648. C
  649. C
  650. C O30--    ROBOT
  651. C
  652. 53000    IF(PRSA.NE.GIVEW) GO TO 53200        !GIVE?
  653.     CALL NEWSTA(PRSO,0,0,0,AROBOT)        !PUT ON ROBOT.
  654.     CALL RSPSUB(302,ODO2)
  655.     RETURN
  656. C
  657. 53200    IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
  658.     CALL NEWSTA(ROBOT,285,0,0,0)        !KILL ROBOT.
  659.     RETURN
  660. C
  661. C O31--    GRUE
  662. C
  663. 56000    IF(PRSA.NE.EXAMIW) GO TO 56100        !EXAMINE?
  664.     CALL RSPEAK(288)
  665.     RETURN
  666. C
  667. 56100    IF(PRSA.NE.FINDW) GO TO 10        !FIND?
  668.     CALL RSPEAK(289)
  669.     RETURN
  670. C
  671.     END
  672.