1 C NOBJS-  New objects processor
   2 C
   3 C Declarations
   4 C
   5           LOGICAL FUNCTION NOBJS(RI,ARG)
   6           IMPLICIT INTEGER (A-Z)
   7           %include dparam
   8           LOGICAL QOPEN,MOVETO,F,RMDESC
   9           LOGICAL QHERE,OPNCLS,MIRPAN
  10           LOGICAL LIT,WASLIT,QEMPTY
  11 C
  12 C Functions and data
  13 C
  14 C old     QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
  15           QOPEN(R)=(AND(OFLAG2(R),OPENBT)).NE.0
  16 C
  17           ODO2=0
  18           ODI2=0
  19           IF((PRSO.NE.0).AND.(PRSO.LE.OMAX)) ODO2=ODESC2(PRSO)
  20           IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  21           AV=AVEHIC(WINNER)
  22           NOBJS=.TRUE.
  23           WASLIT=LIT(HERE)
  24 C
  25           GO TO (1000,2000,3000,4000,5000,6000,7000,8000,9000,
  26           & 10000,11000,12000,13000,14000,15000,16000,17000,
  27           & 18000,19000,20000,21000,22000,23000,24000,25000,
  28           & 26000,27000,28000,29000,30000,31000,32000,33000,
  29           & 34000,35000,36000,37000,38000,39000,40000,41000,
  30           & 42000,43000,44000,45000,46000),
  31           &         (RI-31)
  32           CALL BUG(6,RI)
  33 C
  34 C Return here to declare false result.
  35 C
  36 10        NOBJS=.FALSE.
  37           RETURN
  38 C
  39 C Return here to test for light source change.
  40 C
  41 50        IF(WASLIT.AND..NOT.LIT(HERE)) CALL RSPEAK(406)
  42           RETURN
  43 C page
  44 C NOBJS, PAGE 3
  45 C
  46 C O32--   Bills
  47 C
  48 1000      IF(PRSA.NE.EATW) GO TO 1100             ! eat?
  49           CALL RSPEAK(639)                        ! joke.
  50           RETURN
  51 C
  52 1100      IF(PRSA.EQ.BURNW) CALL RSPEAK(640)      ! burn?  joke.
  53           GO TO 10                                ! let it be handled.
  54 C
  55 C O33--   Screen of light
  56 C
  57 2000      TARGET=SCOL                                       ! target is scol.
  58 2100      IF(PRSO.NE.TARGET) GO TO 2400           ! prso eq target?
  59           IF((PRSA.NE.PUSHW).AND.(PRSA.NE.MOVEW).AND.
  60           &         (PRSA.NE.TAKEW).AND.(PRSA.NE.RUBW)) GO TO 2200
  61           CALL RSPEAK(673)                        ! hand passes thru.
  62           RETURN
  63 C
  64 2200      IF((PRSA.NE.KILLW).AND.(PRSA.NE.ATTACW).AND.
  65           &         (PRSA.NE.MUNGW)) GO TO 2400   ! aggressive?
  66           CALL RSPSUB(674,ODI2)                             ! passes thru.
  67           RETURN
  68 C
  69 2400      IF((PRSA.NE.THROWW).OR.(PRSI.NE.TARGET)) GO TO 10
  70           IF(HERE.EQ.BKBOX) GO TO 2600            ! thru scol?
  71           CALL NEWSTA(PRSO,0,BKBOX,0,0)           ! no, thru wall.
  72           CALL RSPSUB(675,ODO2)                             ! ends up in box room.
  73           CTICK(CEVSCL)=0                                   ! cancel alarm.
  74           SCOLRM=0                                ! reset scol room.
  75           GO TO 50                                ! go see if now dark.
  76 C
  77 2600      IF(SCOLRM.EQ.0) GO TO 2900              ! tried to go thru?
  78           CALL NEWSTA(PRSO,0,SCOLRM,0,0)                    ! success.
  79           CALL RSPSUB(676,ODO2)                             ! ends up somewhere.
  80           CTICK(CEVSCL)=0                                   ! cancel alarm.
  81           SCOLRM=0                                ! reset scol room.
  82           GO TO 50                                ! go see if now dark.
  83 C
  84 2900      CALL RSPEAK(213)                        ! cant do it.
  85           RETURN
  86 C page
  87 C NOBJS, PAGE 4
  88 C
  89 C O34--   Gnome of Zurich
  90 C
  91 3000      IF((PRSA.NE.GIVEW).AND.(PRSA.NE.THROWW)) GO TO 3200
  92           IF(OTVAL(PRSO).NE.0) GO TO 3100                   ! throw a treasure?
  93           IF((PRSO.NE.BRICK).OR.(OCAN(FUSE).NE.BRICK).OR.
  94           &         (CTICK(CEVFUS).EQ.0)) GO TO 3050 ! a bomb?
  95           CALL NEWSTA(ZGNOM,931,0,0,0)            ! gnome leaves.
  96           CALL NEWSTA(BRICK,0,HERE,0,0)           ! brick on floor.
  97           CFLAG(CEVZGO)=.FALSE.                             ! stop gnome timers.
  98           CFLAG(CEVZGI)=.FALSE.
  99           RETURN
 100 C
 101 3050      CALL NEWSTA(PRSO,641,0,0,0)             ! no, go pop.
 102           RETURN
 103 C
 104 3100      CALL NEWSTA(PRSO,0,0,0,0)               ! yes, bye bye treasure.
 105           CALL RSPSUB(642,ODO2)
 106           CALL NEWSTA(ZGNOM,0,0,0,0)              ! bye bye gnome.
 107           CFLAG(CEVZGO)=.FALSE.                             ! cancel exit.
 108           F=MOVETO(BKENT,WINNER)                            ! now in bank entrance.
 109           RETURN
 110 C
 111 3200      IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
 112           &         (PRSA.NE.MUNGW)) GO TO 3300   ! aggressive?
 113           CALL NEWSTA(ZGNOM,643,0,0,0)            ! vanish gnome.
 114           CFLAG(CEVZGO)=.FALSE.                             ! cancel exit.
 115           RETURN
 116 C
 117 3300      CALL RSPEAK(644)                        ! gnome is impatient.
 118           RETURN
 119 C
 120 C O35--   Egg
 121 C
 122 4000      IF((PRSA.NE.OPENW).OR.(PRSO.NE.EGG)) GO TO 4500
 123           IF(.NOT.QOPEN(EGG)) GO TO 4100                    ! open already?
 124           CALL RSPEAK(649)                        ! yes.
 125           RETURN
 126 C
 127 4100      IF(PRSI.NE.0) GO TO 4200                ! with something?
 128           CALL RSPEAK(650)                        ! no, cant.
 129           RETURN
 130 C
 131 4200      IF(PRSI.NE.HANDS) GO TO 4300            ! with hands?
 132           CALL RSPEAK(651)                        ! not recommended.
 133           RETURN
 134 C
 135 4300      I=652                                             ! mung message.
 136 C old     IF(((OFLAG1(PRSI).AND.TOOLBT).NE.0).OR.
 137 C old     &         ((OFLAG2(PRSI).AND.WEAPBT).NE.0)) GO TO 4600
 138           IF(((AND(OFLAG1(PRSI),TOOLBT)).NE.0).OR.
 139           &         ((AND(OFLAG2(PRSI),WEAPBT)).NE.0)) GO TO 4600
 140           I=653                                             ! novelty 1.
 141 C old     IF((OFLAG2(PRSO).AND.FITEBT).NE.0) I=654 ! novelty 2.
 142           IF((AND(OFLAG2(PRSO),FITEBT)).NE.0) I=654 ! novelty 2.
 143 C old     OFLAG2(PRSO)=OFLAG2(PRSO).OR.FITEBT
 144           OFLAG2(PRSO)=OR(OFLAG2(PRSO),FITEBT)
 145           CALL RSPSUB(I,ODI2)
 146           RETURN
 147 C
 148 4500      IF(PRSA.NE.MUNGW) GO TO 10              ! mung?
 149           I=655                                             ! you blew it.
 150 4600      CALL NEWSTA(BEGG,I,OROOM(EGG),OCAN(EGG),OADV(EGG))
 151           CALL NEWSTA(EGG,0,0,0,0)                ! vanish egg.
 152           IF(LASTIT.EQ.EGG) LASTIT=BEGG           ! fix last it reference.
 153           OTVAL(BEGG)=2                                     ! bad egg has value.
 154           IF(OCAN(CANAR).NE.EGG) GO TO 4700       ! was canary inside?
 155           CALL RSPEAK(ODESCO(BCANA))              ! yes, describe result.
 156           OTVAL(BCANA)=1
 157           RETURN
 158 C
 159 4700      CALL NEWSTA(BCANA,0,0,0,0)              ! no, vanish it.
 160           RETURN
 161 C page
 162 C NOBJS, PAGE 5
 163 C
 164 C O36--   Canaries, good and bad
 165 C
 166 5000      IF(PRSA.NE.WINDW) GO TO 10              ! wind em up?
 167           IF(PRSO.EQ.CANAR) GO TO 5100            ! right one?
 168           CALL RSPEAK(645)                        ! no, bad news.
 169           RETURN
 170 C
 171 5100      IF(.NOT.SINGSF.AND.((HERE.EQ.MTREE).OR.
 172           &         ((HERE.GE.FORE1).AND.(HERE.LT.CLEAR))))
 173           &         GO TO 5200                              ! first song in for?
 174           CALL RSPEAK(646)                        ! no, mediocre news.
 175           RETURN
 176 C
 177 5200      SINGSF=.TRUE.                                     ! sang song.
 178           CALL NEWSTA(BAUBL,647,HERE,0,0)                   ! place bauble.
 179           IF(HERE.EQ.MTREE) CALL NEWSTA(BAUBL,0,FORE3,0,0)
 180           RETURN
 181 C
 182 C O37--   White cliffs
 183 C
 184 6000      IF((PRSA.NE.CLMBW).AND.(PRSA.NE.CLMBUW).AND.
 185           &         (PRSA.NE.CLMBDW)) GO TO 10    ! climb?
 186           CALL RSPEAK(648)                        ! oh yeah?
 187           RETURN
 188 C
 189 C O38--   Wall
 190 C
 191 7000      IF((IABS(HERE-MLOC).NE.1).OR.(MRHERE(HERE).NE.0).OR.
 192           &         .NOT.ENDGMF) GO TO 7100                 ! mirror wall in endgame?
 193           IF(PRSA.NE.PUSHW) GO TO 10              ! pushed?
 194           CALL RSPEAK(860)                        ! pushed mirror wall.
 195           RETURN
 196 C
 197 C old 7100          IF((RFLAG(HERE).AND.RNWALL).EQ.0) GO TO 10
 198 7100      IF((AND(RFLAG(HERE),RNWALL)).EQ.0) GO TO 10
 199           CALL RSPEAK(662)                        ! no wall.
 200           RETURN
 201 C page
 202 C NOBJS, PAGE 6
 203 C
 204 C O39--   Global bird
 205 C
 206 8000      IF(PRSA.NE.FINDW) GO TO 8100            ! find?
 207           CALL RSPEAK(666)
 208           RETURN
 209 C
 210 8100      IF(PRSA.NE.EXAMIW) GO TO 10             ! examine?
 211           CALL RSPEAK(667)
 212           RETURN
 213 C
 214 C O40--   Puzzle/Scol walls
 215 C
 216 9000      IF(HERE.NE.CPUZZ) GO TO 9500            ! puzzle walls?
 217           IF(PRSA.NE.PUSHW) GO TO 10              ! push?
 218           DO 9100 I=1,8,2                                   ! locate wall.
 219             IF(PRSO.EQ.CPWL(I)) GO TO 9200
 220 9100      CONTINUE
 221           CALL BUG(80,PRSO)                       ! what?
 222 C
 223 9200      J=CPWL(I+1)                                       ! get directional offset.
 224           NXT=CPHERE+J                                      ! get next state.
 225           WL=CPVEC(NXT)                                     ! get c(next state).
 226           GO TO (9300,9300,9300,9250,9350),(WL+4) ! process.
 227 C
 228 9250      CALL RSPEAK(876)                        ! clear corridor.
 229           RETURN
 230 C
 231 9300      IF(CPVEC(NXT+J).EQ.0) GO TO 9400        ! movable, room to move?
 232 9350      CALL RSPEAK(877)                        ! immovable, no room.
 233           RETURN
 234 C
 235 9400      I=878                                             ! assume first push.
 236           IF(CPUSHF) I=879                        ! not?
 237           CPUSHF=.TRUE.
 238           CPVEC(NXT+J)=WL                                   ! move wall.
 239           CPVEC(NXT)=0                                      ! vacate next state.
 240           CALL CPGOTO(NXT)                        ! onward.
 241           CALL CPINFO(I,NXT)                      ! describe.
 242           CALL PRINCR(.TRUE.,HERE)                ! print rooms contents.
 243           RETURN
 244 C
 245 9500      IF(HERE.NE.SCOLAC) GO TO 9700           ! in scol active room?
 246           DO 9600 I=1,12,3
 247             TARGET=SCOLWL(I+1)                              ! assume target.
 248             IF(SCOLWL(I).EQ.HERE) GO TO 2100      ! treat if found.
 249 9600      CONTINUE
 250 C
 251 9700      IF(HERE.NE.BKBOX) GO TO 10              ! in box room?
 252           TARGET=WNORT
 253           GO TO 2100
 254 C page
 255 C NOBJS, PAGE 7
 256 C
 257 C O41--   Short pole
 258 C
 259 10000     IF(PRSA.NE.RAISEW) GO TO 10100                    ! lift?
 260           I=749                                             ! assume up.
 261           IF(POLEUF.EQ.2) I=750                             ! already up?
 262           CALL RSPEAK(I)
 263           POLEUF=2                                ! pole is raised.
 264           RETURN
 265 C
 266 10100     IF((PRSA.NE.LOWERW).AND.(PRSA.NE.PUSHW)) GO TO 10
 267           IF(POLEUF.NE.0) GO TO 10200             ! already lowered?
 268           CALL RSPEAK(751)                        ! cant do it.
 269           RETURN
 270 C
 271 10200     IF(MOD(MDIR,180).NE.0) GO TO 10300      ! mirror n-s?
 272           POLEUF=0                                ! yes, lower into
 273           CALL RSPEAK(752)                        ! channel.
 274           RETURN
 275 C
 276 10300     IF((MDIR.NE.270).OR.(MLOC.NE.MRB)) GO TO 10400
 277           POLEUF=0                                ! lower into hole.
 278           CALL RSPEAK(753)
 279           RETURN
 280 C
 281 10400     CALL RSPEAK(753+POLEUF)                           ! poleuf = 1 or 2.
 282           POLEUF=1                                ! now on floor.
 283           RETURN
 284 C
 285 C O42--   Mirror switch
 286 C
 287 11000     IF(PRSA.NE.PUSHW) GO TO 10              ! push?
 288           IF(MRPSHF) GO TO 11300                            ! already pushed?
 289           CALL RSPEAK(756)                        ! button goes in.
 290           DO 11100 I=1,OLNT                       ! blocked?
 291             IF(QHERE(I,MREYE).AND.(I.NE.RBEAM)) GO TO 11200
 292 11100     CONTINUE
 293           CALL RSPEAK(757)                        ! nothing in beam.
 294           RETURN
 295 C
 296 11200     CFLAG(CEVMRS)=.TRUE.                              ! mirror opens.
 297           CTICK(CEVMRS)=7
 298           MRPSHF=.TRUE.
 299           MROPNF=.TRUE.
 300           RETURN
 301 C
 302 11300     CALL RSPEAK(758)                        ! mirror already open.
 303           RETURN
 304 C page
 305 C NOBJS, PAGE 8
 306 C
 307 C O43--   Beam function
 308 C
 309 12000     IF((PRSA.NE.TAKEW).OR.(PRSO.NE.RBEAM)) GO TO 12100
 310           CALL RSPEAK(759)                        ! take beam, joke.
 311           RETURN
 312 C
 313 12100     I=PRSO                                            ! assume blk with dirobj.
 314           IF((PRSA.EQ.PUTW).AND.(PRSI.EQ.RBEAM)) GO TO 12200
 315           IF((PRSA.NE.MUNGW).OR.(PRSO.NE.RBEAM).OR.
 316           &         (PRSI.EQ.0)) GO TO 10                   ! break beam with x?
 317           I=PRSI
 318 12200     IF(OADV(I).NE.WINNER) GO TO 12300       ! carrying?
 319           CALL NEWSTA(I,0,HERE,0,0)               ! drop obj.
 320           CALL RSPSUB(760,ODESC2(I))
 321           RETURN
 322 C
 323 12300     J=761                                             ! assume not in room.
 324           IF(QHERE(I,HERE)) J=762                           ! in room?
 325           CALL RSPSUB(J,ODESC2(I))                ! describe.
 326           RETURN
 327 C
 328 C O44--   Bronze door
 329 C
 330 13000     IF((HERE.EQ.NCELL).OR.((LCELL.EQ.4).AND.
 331           &         ((HERE.EQ.CELL).OR.(HERE.EQ.SCORR))))
 332           &         GO TO 13100
 333           CALL RSPEAK(763)                        ! door not there.
 334           RETURN
 335 C
 336 13100     IF(.NOT.OPNCLS(ODOOR,764,765)) GO TO 10 ! open/close?
 337           IF((HERE.EQ.NCELL).AND.QOPEN(ODOOR))
 338           &         CALL RSPEAK(766)              ! descr view.
 339           RETURN
 340 C
 341 C O45--   Quiz door
 342 C
 343 14000     IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 14100
 344           CALL RSPEAK(767)                        ! door wont move.
 345           RETURN
 346 C
 347 14100     IF(PRSA.NE.KNOCKW) GO TO 10             ! knock?
 348           IF(INQSTF) GO TO 14200                            ! tried it already?
 349           INQSTF=.TRUE.                                     ! start inquisition.
 350           CFLAG(CEVINQ)=.TRUE.
 351           CTICK(CEVINQ)=2
 352           QUESNO=RND(8)                                     ! select question.
 353           NQATT=0
 354           CORRCT=0
 355           CALL RSPEAK(768)                        ! announce rules.
 356           CALL RSPEAK(769)
 357           CALL RSPEAK(770+QUESNO)                           ! ask question.
 358           RETURN
 359 C
 360 14200     CALL RSPEAK(798)                        ! no reply.
 361           RETURN
 362 C
 363 C O46--   Locked door
 364 C
 365 15000     IF(PRSA.NE.OPENW) GO TO 10              ! open?
 366           CALL RSPEAK(778)                        ! cant.
 367           RETURN
 368 C
 369 C O47--   Cell door
 370 C
 371 16000     NOBJS=OPNCLS(CDOOR,779,780)             ! open/close?
 372           RETURN
 373 C page
 374 C NOBJS, PAGE 9
 375 C
 376 C O48--   Dialbutton
 377 C
 378 17000     IF(PRSA.NE.PUSHW) GO TO 10              ! push?
 379           CALL RSPEAK(809)                        ! click.
 380           IF(QOPEN(CDOOR)) CALL RSPEAK(810)       ! close cell door.
 381 C old     OFLAG2(CDOOR)=OFLAG2(CDOOR).AND. .NOT.OPENBT
 382           OFLAG2(CDOOR)=AND(OFLAG2(CDOOR), COMPL(OPENBT))
 383 C old     OFLAG2(ODOOR)=OFLAG2(ODOOR).AND. .NOT.OPENBT
 384           OFLAG2(ODOOR)=AND(OFLAG2(ODOOR), COMPL(OPENBT))
 385           IF(LCELL.EQ.PNUMB) RETURN               ! any change?
 386 C
 387           DO 17100 I=1,OLNT                       ! relocate old to hyper.
 388 C old       IF((OROOM(I).EQ.CELL).AND.((OFLAG1(I).AND.DOORBT).EQ.0))
 389 C old     &         CALL NEWSTA(I,0,LCELL*HFACTR,0,0)
 390             IF((OROOM(I).EQ.CELL).AND.((AND(OFLAG1(I),DOORBT)).EQ.0))
 391           &         CALL NEWSTA(I,0,LCELL*HFACTR,0,0)
 392             IF(OROOM(I).EQ.(PNUMB*HFACTR))
 393           &         CALL NEWSTA(I,0,CELL,0,0)     ! move in new hyper.
 394 17100     CONTINUE
 395 C
 396 C old     OFLAG1(ODOOR)=OFLAG1(ODOOR).AND. .NOT.VISIBT
 397           OFLAG1(ODOOR)=AND(OFLAG1(ODOOR), COMPL(VISIBT))
 398 C old     IF(PNUMB.EQ.4) OFLAG1(ODOOR)=OFLAG1(ODOOR).OR.VISIBT
 399           IF(PNUMB.EQ.4) OFLAG1(ODOOR)=OR(OFLAG1(ODOOR),VISIBT)
 400 C
 401           IF(AROOM(PLAYER).NE.CELL) GO TO 17400   ! player in cell?
 402           IF(LCELL.NE.4) GO TO 17200              ! in right cell?
 403 C old     OFLAG1(ODOOR)=OFLAG1(ODOOR).OR. VISIBT
 404           OFLAG1(ODOOR)=OR(OFLAG1(ODOOR), VISIBT)
 405           F=MOVETO(NCELL,PLAYER)                            ! yes, moveto ncell.
 406           GO TO 17400
 407 17200     F=MOVETO(PCELL,PLAYER)                            ! no, moveto pcell.
 408 C
 409 17400     LCELL=PNUMB
 410           RETURN
 411 C page
 412 C NOBJS, PAGE 10
 413 C
 414 C O49--   Dial indicator
 415 C
 416 18000     IF((PRSA.NE.OPENW).OR.(PRSO.NE.BOOK)) GO TO 18100 ! open book?
 417           PNUMB=RND(8)+1                                    ! whee!
 418           CALL RSPSUB(797,712+PNUMB)
 419           RETURN
 420 C
 421 18100     IF((PRSA.NE.MOVEW).AND.(PRSA.NE.PUTW).AND.
 422           &         (PRSA.NE.TRNTOW)) GO TO 10
 423           IF(PRSI.NE.0) GO TO 18200               ! turn dial to x?
 424           CALL RSPEAK(806)                        ! must specify.
 425           RETURN
 426 C
 427 18200     IF((PRSI.GE.NUM1).AND.(PRSI.LE.NUM8)) GO TO 18300
 428           CALL RSPEAK(807)                        ! must be digit.
 429           RETURN
 430 C
 431 18300     PNUMB=PRSI-NUM1+1                       ! set up new.
 432           CALL RSPSUB(808,712+PNUMB)
 433           RETURN
 434 C
 435 C O50--   Global mirror
 436 C
 437 19000     NOBJS=MIRPAN(832,.FALSE.)
 438           RETURN
 439 C
 440 C O51--   Global panel
 441 C
 442 20000     IF(HERE.NE.FDOOR) GO TO 20100           ! at front door?
 443           IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 10
 444           CALL RSPEAK(843)                        ! panel in door, nogo.
 445           RETURN
 446 C
 447 20100     NOBJS=MIRPAN(838,.TRUE.)
 448           RETURN
 449 C
 450 C O52--   Puzzle Room slit
 451 C
 452 21000     IF((PRSA.NE.PUTW).OR.(PRSI.NE.CSLIT)) GO TO 10
 453           IF(PRSO.NE.GCARD) GO TO 21100           ! put card in slit?
 454           CALL NEWSTA(PRSO,863,0,0,0)             ! kill card.
 455           CPOUTF=.TRUE.                                     ! open door.
 456           RETURN
 457 C
 458 C old 21100         IF(((OFLAG1(PRSO).AND.VICTBT).EQ.0).AND.
 459 C old     &  ((OFLAG2(PRSO).AND.VILLBT).EQ.0)) GO TO 21200
 460 21100     IF(((AND (OFLAG1(PRSO),VICTBT)).EQ.0).AND.
 461           &  ((AND (OFLAG2(PRSO),VILLBT)).EQ.0)) GO TO 21200
 462           CALL RSPEAK(552+RND(6))                           ! joke for vill, vict.
 463           RETURN
 464 C
 465 21200     CALL NEWSTA(PRSO,0,0,0,0)               ! kill object.
 466           CALL RSPSUB(864,ODO2)                             ! describe.
 467           RETURN
 468 C page
 469 C NOBJS, PAGE 11
 470 C
 471 C O53--   Global brochure or stamp
 472 C
 473 22000     IF(PRSO.NE.STAMP) GO TO 22100           ! stamp?
 474 C old     IF(PRSA.EQ.TAKEW) OFLAG1(BROCH)=OFLAG1(BROCH).AND..NOT.CONTBT
 475           IF(PRSA.EQ.TAKEW) OFLAG1(BROCH)=AND(OFLAG1(BROCH),COMPL(CONTBT))
 476           GO TO 10                                ! do normal take.
 477 C
 478 22100     IF((PRSO.NE.BROCH).OR.
 479           &  ((PRSA.NE.EXAMIW).AND.(PRSA.NE.READW)))
 480           &  GO TO 22200                                    ! examine brochure?
 481           CALL RSPEAK(942)                        ! describe.
 482           IF(OCAN(STAMP).EQ.BROCH) CALL RSPEAK(943)
 483           RETURN
 484 C
 485 22200     IF((PRSA.NE.FINDW).OR..NOT.BROC1F) GO TO 22300
 486           CALL RSPEAK(944)                        ! on the way.
 487           RETURN
 488 C
 489 22300     IF(PRSA.NE.SENDW) GO TO 22400           ! send?
 490           IF(BROC2F) CALL RSPEAK(945)             ! already got it.
 491           IF(BROC1F.AND..NOT.BROC2F) CALL RSPEAK(944)       ! on the way.
 492           IF(.NOT.BROC1F) CALL RSPEAK(947)        ! postal service.
 493           BROC1F=.TRUE.                                     ! send for brochure.
 494           RETURN
 495 C
 496 22400     IF(PRSO.NE.GBROCH) GO TO 10             ! global brochure?
 497           CALL RSPEAK(1071)                       ! pretend it's not there.
 498           RETURN
 499 C
 500 C O54--   Global ground
 501 C
 502 23000     IF(HERE.EQ.SBEACH) GO TO 36000                    ! at sandy beach? then sand.
 503           IF(PRSA.NE.DIGW) GO TO 10               ! dig?
 504           CALL RSPEAK(924)                        ! can't do it.
 505           RETURN
 506 C
 507 C O55--   Global granite wall
 508 C
 509 24000     I=916                                             ! joke for take.
 510           IF(PRSA.EQ.TAKEW) GO TO 24100           ! take?
 511           I=918                                             ! temple, treasure find.
 512           IF(HERE.EQ.SLIDE) I=917                           ! slide find.
 513           IF(PRSA.NE.FINDW) GO TO 10              ! find?
 514 24100     CALL RSPEAK(I)                                    ! tell all.
 515           RETURN
 516 C page
 517 C NOBJS, PAGE 12
 518 C
 519 C O56--   Global house
 520 C
 521 25000     IF((HERE.GE.WHOUS).AND.(HERE.LE.EHOUS)) GO TO 25200
 522           IF(PRSA.NE.FINDW) GO TO 25100           ! find, not at house?
 523           I=892                                             ! joke 1.
 524           IF(HERE.EQ.CLEAR) I=893                           ! joke 2 for clearing.
 525           CALL RSPEAK(I)
 526           RETURN
 527 C
 528 25100     CALL RSPEAK(894)                        ! not there.
 529           RETURN
 530 C
 531 25200     IF(PRSA.NE.FINDW) GO TO 25300           ! find, at house?
 532           CALL RSPEAK(895)                        ! right there.
 533           RETURN
 534 C
 535 25300     IF(PRSA.NE.EXAMIW) GO TO 25400                    ! look at?
 536           CALL RSPEAK(896)                        ! a nice house.
 537           RETURN
 538 C
 539 25400     IF(PRSA.NE.BURNW) GO TO 25500           ! burn?
 540           CALL RSPEAK(897)                        ! bad boy.
 541           RETURN
 542 C
 543 25500     IF(PRSA.NE.GTHROW) GO TO 10             ! go through?
 544           IF(HERE.EQ.EHOUS) GO TO 25600           ! at east side?
 545           CALL RSPEAK(898)                        ! can't do it
 546           RETURN
 547 C
 548 25600     IF(QOPEN(WINDO)) GO TO 25700            ! window open?
 549           CALL RSPEAK(899)                        ! no, shut
 550           RETURN
 551 C
 552 25700     F=MOVETO(KITCH,WINNER)                            ! move into kitchen.
 553           F=RMDESC(0)                                       ! describe room
 554           RETURN
 555 C
 556 C O57--   Barred window in white house
 557 C
 558 26000     IF((PRSA.NE.OPENW).AND.(PRSA.NE.LOOKIW).AND.
 559           &  (PRSA.NE.GTHROW)) GO TO 26100        ! open, look in, enter?
 560           CALL RSPEAK(1039)                       ! window barred.
 561           RETURN
 562 C
 563 26100     IF(PRSA.NE.CLOSEW) GO TO 10             ! close?
 564           CALL RSPEAK(1040)                       ! already closed and locked.
 565           RETURN
 566 C page
 567 C NOBJS, PAGE 13
 568 C
 569 C O58--   Global well
 570 C
 571 C old 27000         IF(((OFLAG1(PRSO).AND.TAKEBT).EQ.0).OR.(PRSO.EQ.WATER).OR.
 572 C old     &  ((PRSA.NE.THROWW).AND.(PRSA.NE.PUTW).AND.(PRSA.NE.DROPW)))
 573 C old     &  GO TO 10                                       ! throw, put, drop x in well?
 574 27000     IF(((AND(OFLAG1(PRSO),TAKEBT)).EQ.0).OR.(PRSO.EQ.WATER).OR.
 575           &  ((PRSA.NE.THROWW).AND.(PRSA.NE.PUTW).AND.(PRSA.NE.DROPW)))
 576           &  GO TO 10                                       ! throw, put, drop x in well?
 577           CALL RSPSUB(939,ODO2)
 578           CALL NEWSTA(PRSO,0,BWELL,0,0)           ! put in well bottom.
 579           GO TO 50                                ! go see if now dark.
 580 C
 581 C O59--   Global rope
 582 C
 583 28000     IF(PRSA.NE.TAKEW) GO TO 28100           ! take?
 584           CALL RSPEAK(1006)                       ! not a good idea.
 585           RETURN
 586 C
 587 28100     IF(PRSA.NE.DROPW) GO TO 28300           ! drop?
 588           CALL RSPEAK(1007)                       ! you lose.
 589 28200     F=MOVETO(CELLA,WINNER)                            ! drop into cellar.
 590           F=RMDESC(3)                                       ! describe.
 591           RETURN
 592 C
 593 28300     IF((PRSA.EQ.CLMBW).OR.(PRSA.EQ.CLMBUW).OR.
 594           &  (PRSA.EQ.CLMBDW)) GO TO 10           ! normal climb.
 595           CALL RSPEAK(1008)                       ! not a good idea.
 596           RETURN
 597 C
 598 C O60--   Global slide
 599 C
 600 29000     IF((PRSA.NE.GTHROW).AND.
 601           & ((PRSA.NE.PUTW).OR.(PRSO.NE.AOBJ(PLAYER)))) GO TO 29100
 602           CALL RSPEAK(1010)                       ! down the slide.
 603           GO TO 28200
 604 C
 605 29100     IF(PRSA.NE.PUTW) GO TO 10               ! put in slide?
 606 C old     IF((OFLAG1(PRSO).AND.TAKEBT).NE.0) GO TO 29200
 607           IF((AND(OFLAG1(PRSO),TAKEBT)).NE.0) GO TO 29200
 608           CALL RSPEAK(552+RND(6))                           ! can't take it.
 609           RETURN
 610 C
 611 29200     IF(PRSO.NE.TTIE) GO TO 29300            ! tied object?
 612 C old     OFLAG1(TTIE)=OFLAG1(TTIE).AND..NOT.NDSCBT
 613           OFLAG1(TTIE)=AND(OFLAG1(TTIE),COMPL(NDSCBT))
 614           OFLAG1(ROPE)=AND(OFLAG1(ROPE),COMPL(NDSCBT))
 615 C old     OFLAG2(ROPE)=OFLAG2(ROPE).AND..NOT.CLMBBT
 616           OFLAG2(ROPE)=AND(OFLAG2(ROPE),COMPL(CLMBBT))
 617           ODESC1(TIMBE)=1032                      ! restored untied desc.
 618           ODESC1(COFFI)=1033
 619           TTIE=0                                            ! not tied any more.
 620           CALL NEWSTA(ROPE,0,CELLA,0,0)           ! rope is now here.
 621 29300     CALL RSPSUB(1011,ODO2)
 622           CALL NEWSTA(PRSO,0,CELLA,0,0)           ! put in cellar,
 623           IF(PRSO.EQ.WATER) CALL NEWSTA(PRSO,0,0,0,0)       ! unless water.
 624           GO TO 50                                ! go see if now dark.
 625 C page
 626 C NOBJS, PAGE 14
 627 C
 628 C O61--   Barrel
 629 C
 630 30000     IF(ARG.NE.1) GO TO 10                             ! read in?
 631           I=0                                               ! default.
 632           IF(PRSA.EQ.WALKW) I=920                           ! walk?
 633           IF(PRSA.EQ.LOOKW) I=921                           ! look?
 634           IF(PRSA.EQ.BURNW) I=922                           ! burn?
 635           IF(PRSA.EQ.TAKEW) I=552+RND(6)                    ! take?
 636           CALL RSPEAK(I)
 637           NOBJS=I.NE.0                                      ! handled?
 638           RETURN
 639 C
 640 C O62--   Hot bell
 641 C
 642 31000     IF(PRSA.NE.TAKEW) GO TO 31100           ! take?
 643           CALL RSPEAK(972)                        ! too hot.
 644           RETURN
 645 C
 646 31100     IF(PRSA.NE.RINGW) GO TO 31400           ! ring?
 647           IF(PRSI.NE.0) GO TO 31200               ! with something?
 648           CALL RSPEAK(973)                        ! too hot.
 649           RETURN
 650 C
 651 C 31200   IF((OFLAG1(PRSI).AND.BURNBT).EQ.0) GO TO 31300
 652 31200     IF((AND (OFLAG1(PRSI),BURNBT)).EQ.0) GO TO 31300
 653           CALL RSPSUB(974,ODI2)                             ! burnable is consumed.
 654           CALL NEWSTA(PRSI,0,0,0,0)               ! vanish it.
 655           RETURN
 656 C
 657 31300     I=975                                             ! joke 1.
 658           IF(PRSI.EQ.HANDS) I=973                           ! joke for hands.
 659           CALL RSPEAK(I)
 660           RETURN
 661 C
 662 31400     IF(PRSA.NE.PORONW) GO TO 10             ! pour on?
 663           CALL NEWSTA(HBELL,0,0,0,0)              ! vanish bell.
 664           CALL NEWSTA(BELL,976,LLD1,0,0)                    ! insert real bell.
 665           IF(LASTIT.EQ.HBELL) LASTIT=BELL                   ! fix last it reference.
 666           CALL NEWSTA(PRSO,0,0,0,0)               ! vanish water.
 667           CTICK(CEVXBH)=0                                   ! cancel cooling.
 668           RETURN
 669 C
 670 C O63--   Axe
 671 C
 672 32000     IF(PRSA.NE.TAKEW) GO TO 10              ! take?
 673           CALL RSPEAK(891)                        ! too hot.
 674           RETURN
 675 C page
 676 C NOBJS, PAGE 15
 677 C
 678 C O64--   Timber (also coffin)
 679 C
 680 33000     IF((PRSA.NE.TAKEW).OR.(PRSO.NE.TTIE)) GO TO 10
 681           CALL RSPSUB(1009,ODO2)                            ! rope becomes untied.
 682 C old     OFLAG1(TTIE)=OFLAG1(TTIE).AND..NOT.NDSCBT
 683           OFLAG1(TTIE)=AND(OFLAG1(TTIE),COMPL(NDSCBT))
 684 C old     OFLAG1(ROPE)=OFLAG1(ROPE).AND..NOT.NDSCBT
 685           OFLAG1(ROPE)=AND(OFLAG1(ROPE),COMPL(NDSCBT))
 686 C old     OFLAG2(ROPE)=OFLAG2(ROPE).AND..NOT.CLMBBT
 687           OFLAG2(ROPE)=AND(OFLAG2(ROPE),COMPL(CLMBBT))
 688           ODESC1(TIMBE)=1032                      ! restored untied desc.
 689           ODESC1(COFFI)=1033
 690           TTIE=0                                            ! not tied any more.
 691           CALL NEWSTA(ROPE,0,HERE,0,0)            ! rope is now here.
 692           GO TO 10                                ! don't handle.
 693 C
 694 C O65--   Guano
 695 C
 696 34000     IF(PRSA.NE.DIGW) GO TO 10               ! dig?
 697           RVGUA=MIN0(4,RVGUA+1)                             ! go to next state.
 698           CALL RSPEAK(91+RVGUA)                             ! describe.
 699           RETURN
 700 C
 701 C O66--   Alice room leak
 702 C
 703 35000     IF(PRSA.NE.TAKEW) GO TO 35100           ! take?
 704           CALL RSPEAK(552+RND(6))                           ! joke.
 705           RETURN
 706 C
 707 35100     IF((PRSA.NE.PLUGW).OR.(PRSO.NE.PLEAK)) GO TO 10   ! plug leak?
 708           CALL RSPEAK(929)                        ! can't reach.
 709           RETURN
 710 C page
 711 C NOBJS, PAGE 16
 712 C
 713 C O67--   Sand
 714 C
 715 36000     IF(PRSA.NE.DIGW) GO TO 10               ! dig?
 716           RVSND=RVSND+1                                     ! go to next state.
 717           GO TO (36100,36100,36100,36400,36500),RVSND       ! process
 718           CALL BUG(2,RVSND)
 719 C
 720 36100     CALL RSPEAK(85+RVSND)                             ! 1..3, describe.
 721           RETURN
 722 C
 723 C old 36400         IF((OFLAG1(STATU).AND.VISIBT).EQ.0) CALL RSPEAK(89)
 724 36400     IF((AND(OFLAG1(STATU),VISIBT)).EQ.0) CALL RSPEAK(89)
 725 C         OFLAG1(STATU)=OFLAG1(STATU).OR.VISIBT   ! 4, statue appears.
 726           OFLAG1(STATU)=OR(OFLAG1(STATU),VISIBT)  ! 4, statue appears.
 727           RETURN
 728 C
 729 36500     RVSND=0                                           ! 5, sand collapses.
 730 C old     IF(OROOM(STATU).EQ.HERE)
 731 C old     &         OFLAG1(STATU)=OFLAG1(STATU).AND..NOT.VISIBT
 732           IF(OROOM(STATU).EQ.HERE)
 733           &         OFLAG1(STATU)=AND(OFLAG1(STATU),COMPL(VISIBT))
 734           CALL JIGSUP(90)                                   ! gonzo.
 735           RETURN
 736 C
 737 C O68--   Torch
 738 C
 739 37000     IF(PRSA.NE.TRNOFW) GO TO 10             ! extinguish?
 740           CALL RSPEAK(900)                        ! can't do it.
 741           RETURN
 742 C
 743 C O69--   Tool chests
 744 C
 745 38000     IF(PRSA.NE.EXAMIW) GO TO 38100                    ! examine?
 746           CALL RSPEAK(907)                        ! describe.
 747           RETURN
 748 C
 749 38100     IF(PRSA.NE.TAKEW) GO TO 10              ! take?
 750           CALL RSPEAK(908)                        ! can't do it.
 751           RETURN
 752 C page
 753 C NOBJS, PAGE 17
 754 C
 755 C O70--   Palantir door
 756 C
 757 39000     IF((PRSA.NE.LOOKUW).OR..NOT.MATF) GO TO 39100
 758           CALL RSPEAK(995)                        ! mat under door.
 759           RETURN
 760 C
 761 39100     IF(PRSA.NE.UNLOKW) GO TO 39500                    ! unlock?
 762           IF(PRSI.NE.PKEY) GO TO 39400            ! with rusty key?
 763 39200     IF((OCAN(PKEY).EQ.(HERE-PRM+PKH1)).OR.
 764           &         QEMPTY(HERE-PRM+PKH1)) GO TO 39300      ! keyhole empty?
 765 39250     CALL RSPEAK(991)                        ! no
 766           RETURN
 767 C
 768 39300     CALL RSPEAK(996)                        ! now unlocked.
 769           PUNLKF=.TRUE.
 770           RETURN
 771 C
 772 39400     I=997                                             ! joke 1.
 773           IF(PRSI.EQ.KEYS) I=998                            ! joke 2 for keys.
 774           CALL RSPEAK(I)
 775           RETURN
 776 C
 777 39500     IF(PRSA.NE.LOCKW) GO TO 39700           ! lock?
 778           IF(PRSI.EQ.PKEY) GO TO 39600            ! with rusty key?
 779           CALL RSPEAK(999)                        ! no
 780           RETURN
 781 C
 782 39600     IF((OCAN(PKEY).NE.(HERE-PRM+PKH1)).AND.
 783           &         .NOT.QEMPTY(HERE-PRM+PKH1)) GO TO 39250
 784           CALL RSPEAK(1000)                       ! now locked.
 785           PUNLKF=.FALSE.
 786           RETURN
 787 C
 788 39700     IF((PRSA.NE.PUTUNW).OR.((PRSO.NE.BLABE).AND.
 789           &  (PRSO.NE.LABEL).AND.(PRSO.NE.CARD).AND.
 790           &  (PRSO.NE.WARNI).AND.(PRSO.NE.RBTLB).AND.
 791           &  (PRSO.NE.GUIDE))) GO TO 39800        ! put small paper?
 792 C old     CALL NEWSTA(PRSO,1001,HERE.XOR.1,0,0)   ! put in other room.
 793           CALL NEWSTA(PRSO,1001,INT(XOR(HERE,1)),0,0)       ! put in other room.
 794           RETURN
 795 C
 796 39800     IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 10
 797           IF(.NOT.PUNLKF) GO TO 39900             ! open or close, unlocked?
 798           NOBJS=OPNCLS(PRSO,1002,1003)            ! open or close.
 799           RETURN
 800 C
 801 39900     CALL RSPEAK(1000)                       ! door locked.
 802           RETURN
 803 C
 804 C O71--   Palantir window
 805 C
 806 40000     IF(PRSA.NE.GTHROW) GO TO 40100                    ! go through?
 807           CALL RSPEAK(1004)                       ! can't do it.
 808           RETURN
 809 C
 810 40100     IF(PRSA.NE.LOOKIW) GO TO 10             ! look in?
 811           IF(QOPEN(PDOOR)) GO TO 40200            ! door open?
 812           PLOOKF=.TRUE.                                     ! set window flag.
 813 C old     SVFLAG=RFLAG(HERE.XOR.1)                ! save room flags from other.
 814           SVFLAG=RFLAG(INT(XOR(HERE,1)))                    ! save room flags from other.
 815 C old     F=MOVETO(HERE.XOR.1,WINNER)             ! go to other room.
 816           F=MOVETO(INT(XOR(HERE,1)),WINNER)                 ! go to other room.
 817           F=RMDESC(3)                                       ! describe it.
 818 C old     F=MOVETO(HERE.XOR.1,WINNER)             ! come back.
 819           F=MOVETO(INT(XOR(HERE,1)),WINNER)                 ! come back.
 820 C old     RFLAG(HERE.XOR.1)=SVFLAG                ! restore flags.
 821           RFLAG(INT(XOR(HERE,1)))=SVFLAG          ! restore flags.
 822           RETURN
 823 C
 824 40200     CALL RSPEAK(1005)                       ! door open, dummy.
 825           RETURN
 826 C page
 827 C NOBJS, PAGE 18
 828 C
 829 C O72--   Keyhole lids
 830 C
 831 41000     IF((PRSA.NE.OPENW).AND.(PRSA.NE.RAISEW)) GO TO 41100
 832           CALL RSPEAK(985)                        ! open lid.
 833 C old     OFLAG2(PRSO)=OFLAG2(PRSO).OR.OPENBT
 834           OFLAG2(PRSO)=OR(OFLAG2(PRSO),OPENBT)
 835           RETURN
 836 C
 837 41100     IF((PRSA.NE.CLOSEW).AND.(PRSA.NE.LOWERW)) GO TO 10
 838           IF(QEMPTY(PRSO-PLID1+PKH1)) GO TO 41200           ! keyhole empty?
 839           CALL RSPEAK(986)                        ! can't do it.
 840           RETURN
 841 C
 842 41200     CALL RSPEAK(987)                        ! close lid.
 843 C old     OFLAG2(PRSO)=OFLAG2(PRSO).AND..NOT.OPENBT
 844           OFLAG2(PRSO)=AND(OFLAG2(PRSO),COMPL(OPENBT))
 845           RETURN
 846 C
 847 C O73--   Keyholes
 848 C
 849 42000     IF(PRSA.NE.LOOKIW) GO TO 42200                    ! look in?
 850           I=988                                             ! doesn't work.
 851 C old     IF(QOPEN(PLID1).AND.QOPEN(PLID2).AND.
 852 C old     &         QEMPTY(PKH1).AND.QEMPTY(PKH2).AND.
 853 C old     &         LIT(HERE.XOR.1)) I=989                  ! does work
 854           IF(QOPEN(PLID1).AND.QOPEN(PLID2).AND.
 855           &         QEMPTY(PKH1).AND.QEMPTY(PKH2).AND.
 856           &         LIT(INT(XOR(HERE,1)))) I=989            ! does work
 857           CALL RSPEAK(I)
 858           RETURN
 859 C
 860 42200     IF(PRSA.NE.PUTW) GO TO 10               ! put?
 861           IF(QOPEN(PRSI-PKH1+PLID1)) GO TO 42300  ! lid open?
 862           CALL RSPEAK(990)                        ! no.
 863           RETURN
 864 C
 865 42300     IF(QEMPTY(PRSI)) GO TO 42400            ! keyhole empty?
 866           CALL RSPEAK(991)                        ! no.
 867           RETURN
 868 C
 869 42400     IF((PRSO.NE.SCREW).AND.(PRSO.NE.KEYS).AND.
 870           &  (PRSO.NE.STICK).AND.(PRSO.NE.PKEY)) GO TO 42700
 871 C old     IF(QEMPTY(PRSI.XOR.1)) GO TO 10                   ! nothing to shove.
 872           IF(QEMPTY(INT(XOR(PRSI,1)))) GO TO 10             ! nothing to shove.
 873           DO 42500 I=1,OLNT
 874 C old       IF(OCAN(I).EQ.(PRSI.XOR.1)) GO TO 42600         ! find obj in keyhole.
 875             IF(OCAN(I).EQ.(XOR(PRSI,1))) GO TO 42600        ! find obj in keyhole.
 876 42500     CONTINUE
 877 C old     CALL BUG(67,PRSI.XOR.1)
 878           CALL BUG(67,INT(XOR(PRSI,1)))
 879 C
 880 C old 42600         CALL NEWSTA(I,992,HERE.XOR.1,0,0)       ! obj falls to floor.
 881 42600     CALL NEWSTA(I,992,INT(XOR(HERE,1)),0,0) ! obj falls to floor.
 882           IF(MATF) MATOBJ=I                       ! if mat, falls on that.
 883           GO TO 10                                ! finish put.
 884 C
 885 42700     CALL RSPSUB(993,ODO2)                             ! doesn't fit.
 886           RETURN
 887 C page
 888 C NOBJS, PAGE 19
 889 C
 890 C O74--   Rusty key
 891 C
 892 43000     IF(PRSA.NE.TURNW) GO TO 10              ! turn?
 893           IF(PUNLKF) GO TO 39600                            ! unlock?
 894           GO TO 39200                                       ! otherwise lock.
 895 C
 896 C O75--   Palantirs
 897 C
 898 44000     IF(PRSA.NE.LOOKIW) GO TO 10             ! look in?
 899           OBJ=PALAN                               ! assume dest = palan.
 900           IF(PRSO.EQ.PALAN) OBJ=PAL3              ! if palan, then pal3.
 901           IF(PRSO.EQ.PAL3) OBJ=SPHER              ! if pal3, then sphere.
 902           J=HERE                                            ! save here.
 903           K=OCAN(OBJ)                                       ! get dest container.
 904           IF(OROOM(OBJ).NE.0) J=OROOM(OBJ)        ! if dest in room, use.
 905           IF(K.NE.0) J=OROOM(K)                             ! if cont, use cont room.
 906           IF((J.EQ.0).OR.(OADV(OBJ).EQ.-THIEF)) GO TO 44200
 907           IF(.NOT.LIT(J)) GO TO 44200             ! see destination?
 908           IF(K.EQ.0) GO TO 44100                            ! contained?
 909 C old     IF(((OFLAG1(K).AND.TRANBT).EQ.0).AND..NOT.QOPEN(K))
 910 C old     &         GO TO 44200                             ! see out of it?
 911           IF(((AND(OFLAG1(K),TRANBT)).EQ.0).AND..NOT.QOPEN(K))
 912           &         GO TO 44200                             ! see out of it?
 913 44100     CALL RSPEAK(1024)                       ! start vision.
 914 C old     OFLAG1(OBJ)=OFLAG1(OBJ).AND..NOT.VISIBT ! object not visible.
 915           OFLAG1(OBJ)=AND(OFLAG1(OBJ),COMPL(VISIBT))        ! object not visible.
 916           SVHERE=HERE                                       ! save state.
 917           SVFLAG=RFLAG(J)
 918           F=MOVETO(J,WINNER)                      ! move to new room.
 919           F=RMDESC(3)                                       ! describe.
 920           IF(J.EQ.SVHERE) CALL RSPEAK(1026)       ! was it here?
 921           F=MOVETO(SVHERE,WINNER)                           ! come back.
 922           RFLAG(J)=SVFLAG                                   ! restore flags.
 923 C old     OFLAG1(OBJ)=OFLAG1(OBJ).OR.VISIBT       ! restore object.
 924           OFLAG1(OBJ)=OR(OFLAG1(OBJ),VISIBT)      ! restore object.
 925           RETURN
 926 C
 927 44200     CALL RSPEAK(1023)                       ! nothing to see.
 928           RETURN
 929 C
 930 C O76--   Mat
 931 C
 932 45000     IF((PRSA.NE.PUTUNW).OR.(PRSI.NE.PDOOR)) GO TO 45100
 933           MATF=.TRUE.                                       ! put under right door.
 934           CALL NEWSTA(PRSO,983,HERE,0,0)
 935           RETURN
 936 C
 937 45100     IF(((PRSA.NE.TAKEW).AND.(PRSA.NE.MOVEW)).OR.(MATOBJ.EQ.0))
 938           &         GO TO 10                      ! take or move?
 939           CALL NEWSTA(MATOBJ,0,HERE,0,0)                    ! materialize mat object.
 940           CALL RSPSUB(984,ODESC2(MATOBJ))
 941           MATOBJ=0
 942           MATF=.FALSE.
 943           IF(PRSA.EQ.TAKEW) GO TO 10              ! do normal take.
 944           RETURN                                            ! move is done.
 945 C
 946 C O77--   Stove
 947 C
 948 46000     IF((PRSA.NE.TAKEW).AND.(PRSA.NE.RUBW).AND.
 949           &  (PRSA.NE.ATTACW).AND.(PRSA.NE.MUNGW))
 950           &  GO TO 46100                                    ! take, feel, attack, mung?
 951           CALL RSPEAK(994)                        ! too hot.
 952           RETURN
 953 C
 954 46100     IF(PRSA.NE.THROWW) GO TO 10             ! throw at stove?
 955           IF(PRSO.NE.WATER) GO TO 46200           ! water?
 956           CALL NEWSTA(WATER,978,0,0,0)            ! evaporates.
 957           RETURN
 958 C
 959 C old 46200         IF((OFLAG1(PRSO).AND.BURNBT).EQ.0) GO TO 10       ! burnable?
 960 46200     IF((AND(OFLAG1(PRSO),BURNBT)).EQ.0) GO TO 10      ! burnable?
 961           CALL RSPSUB(974,ODO2)                             ! burns up.
 962           CALL NEWSTA(PRSO,0,0,0,0)               ! vanishes.
 963           RETURN
 964 C
 965           END
 966 C page
 967 C MIRPAN--          Processor for global mirror/panel
 968 C
 969 C Declarations
 970 C
 971           LOGICAL FUNCTION MIRPAN(ST,PNF)
 972           IMPLICIT INTEGER (A-Z)
 973           %include dparam
 974           LOGICAL PNF
 975 C
 976           MIRPAN=.TRUE.
 977           NUM=MRHERE(HERE)                        ! get mirror num.
 978           IF(NUM.NE.0) GO TO 100                            ! any here?
 979           CALL RSPEAK(ST)                                   ! no, lose.
 980           RETURN
 981 C
 982 100       IF((PRSA.NE.MOVEW).AND.(PRSA.NE.OPENW)) GO TO 200
 983           CALL RSPEAK(ST+1)                       ! cant open or move.
 984           RETURN
 985 C
 986 200       MRBF=0                                            ! assume mirror ok.
 987           IF(((NUM.EQ.1).AND..NOT.MR1F).OR.
 988           &  ((NUM.EQ.2).AND..NOT.MR2F)) MRBF=1
 989           IF(PNF.OR.((PRSA.NE.LOOKIW).AND.(PRSA.NE.EXAMIW).AND.
 990           &         (PRSA.NE.LOOKW))) GO TO 300
 991           CALL RSPEAK(844+MRBF)                             ! look in mirror.
 992           RETURN
 993 C
 994 300       IF(PRSA.NE.MUNGW) GO TO 400             ! break?
 995           CALL RSPEAK(ST+2+MRBF)                            ! do it.
 996           IF((NUM.EQ.1).AND..NOT.PNF) MR1F=.FALSE.
 997           IF((NUM.EQ.2).AND..NOT.PNF) MR2F=.FALSE.
 998           RETURN
 999 C
1000 400       IF(PNF.OR.(MRBF.EQ.0)) GO TO 500        ! broken mirror?
1001           CALL RSPEAK(846)
1002           RETURN
1003 C
1004 500       IF(PRSA.NE.PUSHW) GO TO 600             ! push?
1005           CALL RSPEAK(ST+3+NUM)
1006           RETURN
1007 C
1008 600       MIRPAN=.FALSE.                                    ! cant handle it.
1009           RETURN
1010 C
1011           END
1012 C page
1013 C BALLOP- Balloon function
1014 C
1015 C Declarations
1016 C
1017           LOGICAL FUNCTION BALLOP(ARG)
1018           IMPLICIT INTEGER (A-Z)
1019           %include dparam
1020           LOGICAL FINDXT,QEMPTY
1021 C
1022           BALLOP=.TRUE.                                     ! assume wins.
1023           IF(ARG.NE.2) GO TO 200                            ! readout?
1024           IF(PRSA.NE.LOOKW) GO TO 10              ! only process look.
1025           IF(BINFF.NE.0) GO TO 50                           ! inflated?
1026           CALL RSPEAK(543)                        ! no.
1027           GO TO 100
1028 50        CALL RSPSUB(544,ODESC2(BINFF))                    ! yes.
1029 100       IF(BTIEF.NE.0) CALL RSPEAK(545)                   ! hooked?
1030           GO TO 10
1031 C
1032 200       IF(ARG.NE.1) GO TO 500                            ! readin?
1033           IF(PRSA.NE.WALKW) GO TO 300             ! walk?
1034           IF(FINDXT(PRSO,HERE)) GO TO 250                   ! valid exit?
1035           CALL RSPEAK(546)                        ! no, joke.
1036           RETURN
1037 C
1038 250       IF(BTIEF.EQ.0) GO TO 275                ! tied up?
1039           CALL RSPEAK(547)                        ! yes, joke.
1040           RETURN
1041 C
1042 275       IF(XTYPE.NE.XNORM) GO TO 10             ! normal exit?
1043 C old     IF((RFLAG(XROOM1).AND.RMUNG).NE.0) GO TO 10
1044           IF((AND(RFLAG(XROOM1),RMUNG)).NE.0) GO TO 10
1045           BLOC=XROOM1
1046           CFLAG(CEVBAL)=.TRUE.
1047           CTICK(CEVBAL)=3
1048 10        BALLOP=.FALSE.
1049           RETURN
1050 C
1051 300       IF((PRSA.NE.TAKEW).OR.(PRSO.NE.BINFF)) GO TO 350
1052           CALL RSPSUB(548,ODESC2(BINFF))                    ! recep cont too hot.
1053           RETURN
1054 C
1055 350       IF((PRSA.NE.PUTW).OR.(PRSI.NE.RECEP).OR.QEMPTY(RECEP))
1056           &         GO TO 10                      ! recep already full.
1057           CALL RSPEAK(549)
1058           RETURN
1059 C
1060 500       IF((PRSA.NE.BURNW).OR.(OCAN(PRSO).NE.RECEP)) GO TO 10
1061           CALL RSPSUB(550,ODESC2(PRSO))           ! light fire in recep.
1062           CFLAG(CEVBRN)=.TRUE.
1063           CTICK(CEVBRN)=OSIZE(PRSO)*20
1064 C old     OFLAG1(PRSO)=(OFLAG1(PRSO).OR.(ONBT+FLAMBT+LITEBT)).AND.
1065 C old     &         .NOT.(TAKEBT+READBT)                    ! burn it.
1066           OFLAG1(PRSO)=AND(OR(OFLAG1(PRSO),ONBT+FLAMBT+LITEBT),
1067           &         COMPL(TAKEBT+READBT))                   ! burn it.
1068           IF(BINFF.NE.0) RETURN                             ! already inflated?
1069           IF(.NOT.BLABF) CALL NEWSTA(BLABE,0,0,BALLO,0)     ! insert label.
1070           BLABF=.TRUE.                                      ! only once.
1071           BINFF=PRSO
1072           CFLAG(CEVBAL)=.TRUE.
1073           CTICK(CEVBAL)=3                                   ! start countdown.
1074           CALL RSPEAK(551)
1075           RETURN
1076 C
1077           END
1078 C page
1079 C TROLLP- Troll function
1080 C
1081 C Declarations
1082 C
1083           LOGICAL FUNCTION TROLLP(ARG)
1084           IMPLICIT INTEGER (A-Z)
1085           %include dparam
1086           LOGICAL QHERE,PROB
1087 C
1088           TROLLP=.TRUE.                                     ! assume wins.
1089           IF(PRSA.NE.FIGHTW) GO TO 1100           ! fight?
1090           IF(OCAN(AXE).EQ.TROLL) GO TO 10                   ! got axe?  nothing.
1091           I=433                                             ! assume cant get.
1092           IF(.NOT.QHERE(AXE,HERE).OR.PROB(25,10)) GO TO 1050          ! here?
1093           I=434                                             ! yes, recover.
1094           CALL NEWSTA(AXE,0,0,TROLL,0)
1095 1050      IF(QHERE(TROLL,HERE)) CALL RSPEAK(I)    ! if player here.
1096           RETURN
1097 C
1098 1100      IF(PRSA.NE.DEADXW) GO TO 1200           ! dead?
1099           TROLLF=.TRUE.                                     ! permit exits.
1100           RETURN
1101 C
1102 1200      IF(PRSA.NE.OUTXW) GO TO 1300            ! out?
1103           TROLLF=.TRUE.                                     ! permit exits.
1104 C old     OFLAG1(AXE)=OFLAG1(AXE).AND. .NOT.VISIBT
1105           OFLAG1(AXE)=AND(OFLAG1(AXE), COMPL(VISIBT))
1106           ODESC1(TROLL)=435                       ! troll out.
1107           RETURN
1108 C
1109 1300      IF((PRSA.NE.INXW).AND.                            ! wake from fight demon?
1110           &  (((PRSA.NE.ALARMW).AND.(PRSA.NE.KICKW)).OR.
1111           &    (OCAPAC(TROLL).GE.0))) GO TO 1400  ! wake, kick while out?
1112           OCAPAC(TROLL)=IABS(OCAPAC(TROLL))       ! yes, wake him.
1113 C old     OFLAG1(AXE)=OFLAG1(AXE).OR.VISIBT
1114           OFLAG1(AXE)=OR (OFLAG1(AXE),VISIBT)
1115           TROLLF=.FALSE.                                    ! forbid exits.
1116           ODESC1(TROLL)=436                       ! troll in.
1117           IF(QHERE(TROLL,HERE)) CALL RSPEAK(437)
1118           RETURN
1119 C
1120 1400      IF(PRSA.NE.FRSTQW) GO TO 1500           ! first encounter?
1121           TROLLP=PROB(33,66)                      ! 33% true unless badlk.
1122           RETURN
1123 C
1124 1500      IF((PRSA.NE.MOVEW).AND.(PRSA.NE.TAKEW).AND.(PRSA.NE.MUNGW)
1125           &         .AND.(PRSA.NE.THROWW).AND.(PRSA.NE.GIVEW)) GO TO 2000
1126           IF(OCAPAC(TROLL).GE.0) GO TO 1550       ! troll out?
1127           OCAPAC(TROLL)=IABS(OCAPAC(TROLL))       ! yes, wake him.
1128 C old     OFLAG1(AXE)=OFLAG1(AXE).OR.VISIBT
1129           OFLAG1(AXE)=OR(OFLAG1(AXE),VISIBT)
1130           TROLLF=.FALSE.                                    ! forbid exits.
1131           ODESC1(TROLL)=436                       ! troll in.
1132           CALL RSPEAK(437)
1133 C
1134 1550      IF((PRSA.NE.TAKEW).AND.(PRSA.NE.MOVEW)) GO TO 1600
1135           CALL RSPEAK(438)                        ! joke.
1136           RETURN
1137 C
1138 1600      IF(PRSA.NE.MUNGW) GO TO 1700            ! mung?
1139           CALL RSPEAK(439)                        ! joke.
1140           RETURN
1141 C
1142 1700      IF(PRSO.EQ.0) GO TO 10                            ! no object?
1143           I=440                                             ! assume throw.
1144           IF(PRSA.EQ.GIVEW) I=441                           ! give?
1145           CALL RSPSUB(I,ODESC2(PRSO))             ! troll takes.
1146           IF(PRSO.EQ.KNIFE) GO TO 1900            ! obj knife?
1147           CALL NEWSTA(PRSO,442,0,0,0)             ! no, eats it.
1148           RETURN
1149 C
1150 1900      CALL RSPEAK(443)                        ! knife, throws it back
1151 C old     OFLAG2(TROLL)=OFLAG2(TROLL).OR.FITEBT   ! and gets mad.
1152           OFLAG2(TROLL)=OR(OFLAG2(TROLL),FITEBT)  ! and gets mad.
1153           RETURN
1154 C
1155 2000      IF(.NOT.TROLLF.OR.(PRSA.NE.HELLOW)) GO TO 10
1156           CALL RSPEAK(366)                        ! troll out.
1157           RETURN
1158 C
1159 10        TROLLP=.FALSE.                                    ! couldnt handle it.
1160           RETURN
1161 C
1162           END