1 C Verb processors for DUNGEON
   2 C
   3 C COPYRIGHT 1980, 1990, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA.
   4 C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
   5 C WRITTEN BY R. M. SUPNIK
   6 C
   7 C 1-Oct-94          RMS       Fixed bugs in ANSWER, INCANT, UNTIE FROM, FILL,
   8 C                             GIVE, SHAKE, PLAY, POUR, POUR ON, TAKE, SPIN, BURN,
   9 C                             ALARM, collectives, subcripting.
  10 C                             Added COUNT, Puzzle Room entrance test.
  11 C 11-Feb-94         RMS       Fixed bug in chimney load calculation.
  12 C 30-Jan-94         RMS       Fixed bugs from MS DOS port.
  13 C 27-Jan-94         RMS       Fixed portability problem in answer array.
  14 C 25-Jan-94         RMS       Fixed bug in DIG not with shovel.
  15 C 09-Jul-92         RMS       Fixed subscript range error.
  16 C 01-Jul-92         RMS       Removed extraneous function from TAKE.
  17 C 30-Jun-92         RMS       Changed file names to lower case.
  18 C
  19 C VAPPLI- Main verb processing routine
  20 C
  21 C Declarations
  22 C
  23           LOGICAL FUNCTION VAPPLI(RI)
  24           IMPLICIT INTEGER (A-Z)
  25           %include dparam
  26           PARAMETER (MXNOP=39,MXJOKE=64,MXSMP=99)
  27           PARAMETER (NUMANS=16)
  28           LOGICAL LIT,OBJACT,WASLIT
  29           LOGICAL QEMPTY,RMDESC,CLOCKD
  30           LOGICAL MOVETO,YESNO
  31           LOGICAL QOPEN,EDIBLE,DRKBLE
  32           LOGICAL TAKE,PUT,DROP,WALK
  33           LOGICAL QHERE,FINDXT,OAPPLI,F
  34           INTEGER JOKES(25),ANSWER(NUMANS)
  35           CHARACTER*12 ANSSTR(NUMANS)
  36           CHARACTER*(WRDLNT) PW(2),CH,CH2
  37 C
  38 C Functions and data
  39 C
  40 C old     QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
  41           QOPEN(R)=AND(OFLAG2(R),OPENBT).NE.0
  42 C old     EDIBLE(R)=(OFLAG1(R).AND.FOODBT).NE.0
  43           EDIBLE(R)=AND(OFLAG1(R),FOODBT).NE.0
  44 C old     DRKBLE(R)=(OFLAG1(R).AND.DRNKBT).NE.0
  45           DRKBLE(R)=AND(OFLAG1(R),DRNKBT).NE.0
  46           DATA JOKES/4,5,3,304,305,306,307,308,309,310,311,312,
  47           &         313,5314,5319,324,325,883,884,120,120,0,0,0,0/
  48           DATA ANSWER/0,1,2,2,3,4,4,4,4,4,5,5,5,6,7,7/
  49           DATA ANSSTR/'TEMPLE','FOREST','30003','30,003','FLASK','RUB',
  50           &         'FONDLE','CARESS','FEEL','TOUCH','BONES','BODY',
  51           &         'SKELETON','RUSTY KNIFE','NONE','NOWHERE'/
  52 C page
  53 C VAPPLI, PAGE 2
  54 C
  55           VAPPLI=.TRUE.                                     ! assume wins.
  56           ODO2=0
  57           ODI2=0
  58           IF((PRSO.NE.0).AND.(PRSO.LE.OMAX)) ODO2=ODESC2(PRSO)
  59           IF(PRSI.NE.0) ODI2=ODESC2(PRSI)                   ! set up descriptors.
  60           AV=AVEHIC(WINNER)                       ! (PRSO can be direction.)
  61           RMK=372+RND(6)                                    ! remark for hack-hacks.
  62           IF(RI.EQ.0) GO TO 10                              ! zero is false.
  63           IF(RI.LE.MXNOP) RETURN                            ! nop?
  64           IF(RI.LE.MXJOKE) GO TO 20               ! joke?
  65           IF(RI.LE.MXSMP) GO TO 30                ! simple verb?
  66           WASLIT=LIT(HERE)
  67           GO TO (
  68           &   500, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000,
  69           & 10000,11000,12000,13000,14000,15000,16000,17000,18000,19000,
  70           & 20000,21000,22000,23000,24000,25000,26000,27000,28000,29000,
  71           & 30000,31000,32000,33000,34000,35000,36000,37000,38000,39000,
  72           & 40000,41000,42000,43000,44000,45000,46000,47000,48000,49000,
  73           & 50000,51000,52000,53000,54000,55000,56000,57000,58000,59000,
  74           & 60000,61000,62000,63000,64000,65000,66000,67000,68000,69000),
  75           &         (RI-MXSMP)
  76           CALL BUG(7,RI)
  77 C
  78 C All verb processors return here to declare failure.
  79 C
  80 10        VAPPLI=.FALSE.                                    ! lose.
  81           RETURN
  82 C
  83 C Joke processor.
  84 C Find proper entry in jokes, use it to select string to print.
  85 C
  86 20        I=JOKES(RI-MXNOP)                       ! get table entry.
  87           J=I/1000                                ! isolate # strings.
  88           IF(J.NE.0) I=MOD(I,1000)+RND(J)                   ! if random, choose.
  89           CALL RSPEAK(I)                                    ! print joke.
  90           RETURN
  91 C
  92 C 'Simple' verbs.
  93 C
  94 30        GO TO (65001,66001,67001,68001,69001,
  95           & 70000,71000,72000,73000,74000,75000,76000,77000,78000,79000,
  96           & 80000,81000,82000,83000,84000,85000,86000,87000,88000,89000,
  97           & 90000,91000,92000,93000,94000,95000,96000,97000),
  98           &         (RI-MXJOKE)
  99           CALL BUG(7,RI)
 100 C
 101 C Here to test for change in light.
 102 C
 103 50        IF(WASLIT.AND..NOT.LIT(HERE)) CALL RSPEAK(406)
 104           RETURN
 105 C page
 106 C VAPPLI, PAGE 3
 107 C
 108 C V100--  Read
 109 C
 110 500       IF(LIT(HERE)) GO TO 600                           ! room lit?
 111           CALL RSPEAK(356)                        ! no, cant read.
 112           RETURN
 113 C
 114 600       IF(PRSI.EQ.0) GO TO 700                           ! read through obj?
 115 C old     IF((OFLAG1(PRSI).AND.TRANBT).NE.0) GO TO 700
 116           IF(AND(OFLAG1(PRSI),TRANBT).NE.0) GO TO 700
 117           CALL RSPSUB(357,ODI2)                             ! not transparent.
 118           RETURN
 119 C
 120 700       IF(OBJACT(X)) RETURN                              ! object handle?
 121 C old     IF((OFLAG1(PRSO).AND.READBT).NE.0) GO TO 800
 122           IF(AND(OFLAG1(PRSO),READBT).NE.0) GO TO 800
 123           CALL RSPSUB(358,ODO2)                             ! not readable.
 124           RETURN
 125 C
 126 800       CALL RSPEAK(OREAD(PRSO))                ! print reading material.
 127           RETURN
 128 C
 129 C V101--  Melt
 130 C
 131 1000      IF(.NOT.OBJACT(X)) CALL RSPSUB(361,ODO2)
 132           RETURN
 133 C
 134 C V102--  Inflate
 135 C
 136 C old 2000          IF((OFLAG1(PRSI).AND.TOOLBT).NE.0) GO TO 2100     ! tool?
 137 2000      IF(AND(OFLAG1(PRSI),TOOLBT).NE.0) GO TO 2100      ! tool?
 138           CALL RSPSUB(301,ODI2)                                       ! no, joke.
 139           RETURN
 140 C
 141 2100      IF(.NOT.OBJACT(X)) CALL RSPEAK(368)     ! obj handle?
 142           RETURN
 143 C
 144 C V103--  Deflate.
 145 C
 146 3000      IF(.NOT.OBJACT(X)) CALL RSPEAK(369)     ! obj handle?
 147           RETURN
 148 C page
 149 C VAPPLI, PAGE 4
 150 C
 151 C V104--  Alarm
 152 C
 153 C old 4000          IF((OFLAG2(PRSO).AND.VILLBT).NE.0) GO TO 4100     ! villain?
 154 4000      IF(AND(OFLAG2(PRSO),VILLBT).NE.0) GO TO 4100      ! villain?
 155           CALL RSPEAK(552+RND(6))                           ! no, joke.
 156           RETURN
 157 C
 158 4100      IF(.NOT.OBJACT(X)) CALL RSPSUB(370,ODO2)
 159           RETURN
 160 C
 161 C V105--  Exorcise
 162 C
 163 5000      F=OBJACT(X)                                       ! objects handle.
 164           RETURN
 165 C
 166 C V106--  Plug
 167 C
 168 6000      IF(.NOT.OBJACT(X)) CALL RSPEAK(371)
 169           RETURN
 170 C
 171 C V107--  Kick
 172 C
 173 7000      IF(.NOT.OBJACT(X)) CALL RSPSB2(378,ODO2,RMK)
 174           RETURN
 175 C
 176 C V108--  Wave
 177 C
 178 8000      IF(.NOT.OBJACT(X)) CALL RSPSB2(379,ODO2,RMK)
 179           RETURN
 180 C
 181 C V109,V110--       Raise, lower
 182 C
 183 9000      CONTINUE
 184 10000     IF(.NOT.OBJACT(X)) CALL RSPSB2(380,ODO2,RMK)
 185           RETURN
 186 C
 187 C V111--  Rub
 188 C
 189 11000     IF(.NOT.OBJACT(X)) CALL RSPSB2(381,ODO2,RMK)
 190           RETURN
 191 C
 192 C V112--  Push
 193 C
 194 12000     IF(.NOT.OBJACT(X)) CALL RSPSB2(382,ODO2,RMK)
 195           RETURN
 196 C page
 197 C VAPPLI, PAGE 5
 198 C
 199 C V113--  Untie
 200 C
 201 13000     IF(OBJACT(X)) RETURN                              ! object handle?
 202           I=383                                             ! no, not tied.
 203 C old     IF((OFLAG2(PRSO).AND.TIEBT).EQ.0) I=384 ! not tieable.
 204           IF(AND(OFLAG2(PRSO),TIEBT).EQ.0) I=384  ! not tieable.
 205           CALL RSPEAK(I)
 206           RETURN
 207 C
 208 C V114--  Tie
 209 C
 210 C old 14000         IF((OFLAG2(PRSO).AND.TIEBT).NE.0) GO TO 14100
 211 14000     IF(AND(OFLAG2(PRSO),TIEBT).NE.0) GO TO 14100
 212           CALL RSPEAK(385)                        ! not tieable.
 213           RETURN
 214 C
 215 14100     IF(OBJACT(X)) RETURN                              ! object handle?
 216           I=386                                             ! joke 1.
 217           IF(PRSI.EQ.OPLAY) I=919                           ! if player, joke 2.
 218           CALL RSPSUB(386,ODO2)                             ! print remark.
 219           RETURN
 220 C
 221 C V115--  Tie up
 222 C
 223 C old 15000         IF((OFLAG2(PRSI).AND.TIEBT).NE.0) GO TO 15100
 224 15000     IF(AND(OFLAG2(PRSI),TIEBT).NE.0) GO TO 15100
 225           CALL RSPSUB(387,ODO2)                             ! not tieable.
 226           RETURN
 227 C
 228 15100     I=388                                             ! assume villain.
 229 C old     IF((OFLAG2(PRSO).AND.VILLBT).EQ.0) I=389
 230           IF(AND(OFLAG2(PRSO),VILLBT).EQ.0) I=389
 231           CALL RSPSUB(I,ODO2)                     ! joke.
 232           RETURN
 233 C
 234 C V116--  Turn
 235 C
 236 C old 16000         IF((OFLAG1(PRSO).AND.TURNBT).NE.0) GO TO 16100
 237 16000     IF(AND(OFLAG1(PRSO),TURNBT).NE.0) GO TO 16100
 238           CALL RSPEAK(390)                        ! not turnable.
 239           RETURN
 240 C
 241 C old 16100         IF((OFLAG1(PRSI).AND.TOOLBT).NE.0) GO TO 16200
 242 16100     IF(AND(OFLAG1(PRSI),TOOLBT).NE.0) GO TO 16200
 243           CALL RSPSUB(391,ODI2)                             ! not a tool.
 244           RETURN
 245 C
 246 16200     VAPPLI=OBJACT(X)                        ! let object handle.
 247           RETURN
 248 C
 249 C V117--  Breathe
 250 C
 251 17000     PRSA=INFLAW
 252           PRSI=LUNGS
 253           GO TO 2000                                        ! handle like inflate.
 254 C page
 255 C VAPPLI, PAGE 5A.
 256 C
 257 C V118--  Knock
 258 C
 259 18000     IF(OBJACT(X)) RETURN                              ! obj handle?
 260           I=394                                             ! joke for door.
 261 C old     IF((OFLAG1(PRSO).AND.DOORBT).EQ.0) I=395
 262           IF(AND(OFLAG1(PRSO),DOORBT).EQ.0) I=395
 263           CALL RSPSUB(I,ODO2)                     ! joke for nondoors too.
 264           RETURN
 265 C
 266 C V119--  Look
 267 C
 268 19000     IF(PRSO.NE.0) GO TO 20500               ! something to look at?
 269           VAPPLI=RMDESC(3)                        ! handled by rmdesc.
 270           RETURN
 271 C
 272 C V120--  Examine
 273 C
 274 20000     IF(PRSO.NE.0) GO TO 20500               ! something to examine?
 275           VAPPLI=RMDESC(0)                        ! handled by rmdesc.
 276           RETURN
 277 C
 278 20500     IF(OBJACT(X)) RETURN                              ! obj handle?
 279           I=OREAD(PRSO)                                     ! get reading material.
 280           IF(I.NE.0) CALL RSPEAK(I)               ! output if there,
 281           IF(I.EQ.0) CALL RSPSUB(429,ODO2)        ! otherwise default.
 282           PRSA=FOOW                               ! defuse room processors.
 283           RETURN
 284 C
 285 C V121--  Shake
 286 C
 287 21000     IF(OBJACT(X)) RETURN                              ! object handle?
 288           IF(PRSO.EQ.GWATE) GO TO 10              ! global water? fails.
 289 C old     IF((OFLAG2(PRSO).AND.VILLBT).EQ.0) GO TO 21100
 290           IF(AND(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 21100
 291           CALL RSPEAK(371)                        ! joke for villains.
 292           RETURN
 293 C
 294 21100     IF(PRSO.NE.AV) GO TO 21150              ! vehicle?
 295           CALL RSPEAK(672)                        ! yes, joke.
 296           RETURN
 297 C
 298 C old 21150         IF((OFLAG1(PRSO).AND.TAKEBT).NE.0) GO TO 21200    ! takeable?
 299 21150     IF(AND(OFLAG1(PRSO),TAKEBT).NE.0) GO TO 21200     ! takeable?
 300           CALL RSPEAK(923)                        ! no, joke.
 301           RETURN
 302 C
 303 21200     IF(OADV(PRSO).EQ.WINNER) GO TO 21250    ! carrying?
 304           CALL RSPEAK(527)                        ! no, joke.
 305           RETURN
 306 C
 307 21250     IF(QEMPTY(PRSO)) GO TO 10               ! empty?  fails.
 308           IF(QOPEN(PRSO)) GO TO 21300             ! open?  spill.
 309           CALL RSPSUB(396,ODO2)                             ! no, describe noise.
 310           RETURN
 311 C
 312 21300     CALL RSPSUB(397,ODO2)                             ! spill the works.
 313           DO 21500 I=1,OLNT                       ! spill contents.
 314             IF(OCAN(I).NE.PRSO) GO TO 21500       ! inside?
 315 C old       OFLAG2(I)=OFLAG2(I).OR.TCHBT                    ! touch object.
 316             OFLAG2(I)=OR(OFLAG2(I),TCHBT)                   ! touch object.
 317             IF(AV.EQ.0) GO TO 21400               ! in vehicle?
 318             CALL NEWSTA(I,0,0,AV,0)               ! yes, spill in there.
 319             GO TO 21500
 320 C
 321 21400       CALL NEWSTA(I,0,HERE,0,0)             ! no, spill on floor,
 322             IF(I.EQ.WATER) CALL NEWSTA(I,133,0,0,0)         ! but water disappears.
 323 21500     CONTINUE
 324           RETURN
 325 C page
 326 C VAPPLI, PAGE 6
 327 C
 328 C V122--  Move
 329 C
 330 22000     IF(.NOT.QHERE(PRSO,HERE)) GO TO 22100   ! is it here?
 331           IF(OBJACT(X)) RETURN                              ! obj handle?
 332           I=399                                             ! assume not takeable.
 333 C old     IF((OFLAG1(PRSO).AND.TAKEBT).NE.0) I=887
 334           IF(AND(OFLAG1(PRSO),TAKEBT).NE.0) I=887
 335           CALL RSPSUB(I,ODO2)                     ! joke.
 336           RETURN
 337 C
 338 22100     CALL RSPEAK(398)                        ! not here.
 339           RETURN
 340 C
 341 C V123--  Turn on
 342 C
 343 23000     IF(OBJACT(X)) RETURN                              ! object handle?
 344 C old     IF(((OFLAG1(PRSO).AND.LITEBT).NE.0).AND.
 345 C old     &         (OADV(PRSO).EQ.WINNER)) GO TO 23100
 346           IF((AND(OFLAG1(PRSO),LITEBT).NE.0).AND.
 347           &         (OADV(PRSO).EQ.WINNER)) GO TO 23100
 348           CALL RSPEAK(400)                        ! cant do it.
 349           RETURN
 350 C
 351 C old 23100         IF((OFLAG1(PRSO).AND.ONBT).EQ.0) GO TO 23200
 352 23100     IF(AND(OFLAG1(PRSO),ONBT).EQ.0) GO TO 23200
 353           CALL RSPEAK(401)                        ! already on.
 354           RETURN
 355 C
 356 C old 23200         OFLAG1(PRSO)=OFLAG1(PRSO).OR.ONBT       ! turn it on.
 357 23200     OFLAG1(PRSO)=OR(OFLAG1(PRSO),ONBT)      ! turn it on.
 358           CALL RSPSUB(404,ODO2)
 359           RETURN
 360 C
 361 C V124--  Turn off
 362 C
 363 24000     IF(OBJACT(X)) RETURN                              ! obj handle?
 364 C old     IF(((OFLAG1(PRSO).AND.LITEBT).NE.0).AND.
 365 C old     &         (OADV(PRSO).EQ.WINNER)) GO TO 24100
 366           IF((AND(OFLAG1(PRSO),LITEBT).NE.0).AND.
 367           &         (OADV(PRSO).EQ.WINNER)) GO TO 24100
 368           CALL RSPEAK(402)                        ! cant do it.
 369           RETURN
 370 C
 371 C old 24100         IF((OFLAG1(PRSO).AND.ONBT).NE.0) GO TO 24200
 372 24100     IF(AND(OFLAG1(PRSO),ONBT).NE.0) GO TO 24200
 373           CALL RSPEAK(403)                        ! already off.
 374           RETURN
 375 C
 376 C old 24200         OFLAG1(PRSO)=OFLAG1(PRSO).AND. .NOT.ONBT
 377 24200     OFLAG1(PRSO)=AND(OFLAG1(PRSO), COMPL(ONBT))
 378           CALL RSPSUB(405,ODO2)
 379           GO TO 50                                ! go see if now dark.
 380 C
 381 C V125--  Open
 382 C
 383 25000     IF(OBJACT(X)) RETURN                              ! obj handle?
 384 C old     IF((OFLAG1(PRSO).AND.DOORBT).NE.0) GO TO 25150    ! door?
 385           IF(AND(OFLAG1(PRSO),DOORBT).NE.0) GO TO 25150     ! door?
 386 C old     IF((OFLAG1(PRSO).AND.CONTBT).NE.0) GO TO 25100    ! container?
 387           IF(AND(OFLAG1(PRSO),CONTBT).NE.0) GO TO 25100     ! container?
 388 25050     CALL RSPSUB(407,ODO2)                             ! not door or container.
 389           RETURN
 390 C
 391 25100     IF(OCAPAC(PRSO).NE.0) GO TO 25200       ! openable container?
 392 25150     CALL RSPSUB(408,ODO2)                             ! door or not openable.
 393           RETURN
 394 C
 395 25200     IF(.NOT.QOPEN(PRSO)) GO TO 25225
 396           CALL RSPEAK(412)                        ! already open.
 397           RETURN
 398 C
 399 C old 25225         OFLAG2(PRSO)=OFLAG2(PRSO).OR.OPENBT     ! open it.
 400 25225     OFLAG2(PRSO)=OR(OFLAG2(PRSO),OPENBT)    ! open it.
 401 C old     IF(((OFLAG1(PRSO).AND.TRANBT).NE.0).OR.QEMPTY(PRSO))
 402 C old     &         GO TO 25300
 403           IF((AND(OFLAG1(PRSO),TRANBT).NE.0).OR.QEMPTY(PRSO))
 404           &         GO TO 25300
 405           CALL PRINCO(PRSO,410,.FALSE.)           ! print contents.
 406           RETURN
 407 C
 408 25300     CALL RSPEAK(409)                        ! done
 409           RETURN
 410 C
 411 C V126--  Close
 412 C
 413 26000     IF(OBJACT(X)) RETURN                              ! obj handle?
 414 C old     IF((OFLAG1(PRSO).AND.DOORBT).NE.0) GO TO 26050    ! door?
 415           IF(AND(OFLAG1(PRSO),DOORBT).NE.0) GO TO 26050     ! door?
 416 C old     IF((OFLAG1(PRSO).AND.CONTBT).EQ.0) GO TO 25050    ! container?
 417           IF(AND(OFLAG1(PRSO),CONTBT).EQ.0) GO TO 25050     ! container?
 418           IF(OCAPAC(PRSO).NE.0) GO TO 26100       ! closable container?
 419 26050     CALL RSPSUB(411,ODO2)                             ! door or not closable.
 420           RETURN
 421 C
 422 26100     IF(QOPEN(PRSO)) GO TO 26200             ! open?
 423           CALL RSPEAK(413)                        ! no, joke.
 424           RETURN
 425 C
 426 C old 26200         OFLAG2(PRSO)=OFLAG2(PRSO).AND. .NOT.OPENBT
 427 26200     OFLAG2(PRSO)=AND(OFLAG2(PRSO), COMPL(OPENBT))
 428           CALL RSPEAK(414)                        ! done.
 429           GO TO 50                                ! go see if now dark.
 430 C page
 431 C VAPPLI, PAGE 7
 432 C
 433 C V127--  Find
 434 C
 435 27000     IF(OBJACT(X)) RETURN                              ! obj handle?
 436           I=415                                             ! room string.
 437           IF(QHERE(PRSO,HERE)) GO TO 27200        ! in room?
 438           I=416                                             ! winner string.
 439           IF(OADV(PRSO).EQ.WINNER) GO TO 27200    ! on winner?
 440           J=OCAN(PRSO)                                      ! down one level.
 441           IF(J.EQ.0) GO TO 10
 442 C old     IF((((OFLAG1(J).AND.TRANBT).EQ.0).AND.
 443 C old     & (.NOT.QOPEN(J).OR.((OFLAG1(J).AND.(DOORBT+CONTBT)).EQ.0))))
 444 C old     &         GO TO 10                      ! if not visible, punt.
 445           IF(((AND(OFLAG1(J),TRANBT).EQ.0).AND.
 446           & (.NOT.QOPEN(J).OR.(AND(OFLAG1(J),(DOORBT+CONTBT)).EQ.0))))
 447           &         GO TO 10                      ! if not visible, punt.
 448           I=417                                             ! assume in room.
 449           IF(QHERE(J,HERE)) GO TO 27100
 450           I=418                                             ! assume on winner.
 451           IF(OADV(J).NE.WINNER) GO TO 10                    ! not here or on person.
 452 27100     CALL RSPSUB(I,ODESC2(J))                ! describe findings.
 453           RETURN
 454 C
 455 27200     CALL RSPSUB(I,ODO2)                     ! describe findings.
 456           RETURN
 457 C
 458 C V128--  Wait
 459 C
 460 28000     CALL RSPEAK(419)                        ! time passes.
 461           DO 28100 I=1,3
 462             IF(CLOCKD(X)) RETURN
 463             IF(.NOT.DEADF) CALL FIGHTD
 464             IF(PRSCON.EQ.0) RETURN                ! fighting happened.
 465 28100     CONTINUE
 466           RETURN
 467 C
 468 C V129--  Spin
 469 C V159--  Turn to
 470 C
 471 29000     CONTINUE
 472 59000     IF(OBJACT(X)) RETURN                              ! object handle?
 473 C old     IF((OFLAG1(PRSO).AND.TURNBT).NE.0) GO TO 59100
 474           IF(AND(OFLAG1(PRSO),TURNBT).NE.0) GO TO 59100
 475           CALL RSPEAK(390)                        ! can't turn?
 476           RETURN
 477 C
 478 59100     CALL RSPSUB(663,ODO2)                             ! won't budge.
 479           RETURN
 480 C
 481 C V130--  Board
 482 C
 483 C old 30000         IF((OFLAG2(PRSO).AND.VEHBT).NE.0) GO TO 30100
 484 30000     IF(AND(OFLAG2(PRSO),VEHBT).NE.0) GO TO 30100
 485           CALL RSPSUB(421,ODO2)                             ! not vehicle, joke.
 486           PRSCON=0                                ! kill cmd stream.
 487           RETURN
 488 C
 489 30100     IF(QHERE(PRSO,HERE)) GO TO 30200        ! here?
 490           CALL RSPSUB(420,ODO2)                             ! no, joke.
 491           PRSCON=0                                ! kill cmd stream.
 492           RETURN
 493 C
 494 30200     IF(AV.EQ.0) GO TO 30300                           ! already got one?
 495           CALL RSPSUB(422,ODO2)                             ! yes, joke.
 496           PRSCON=0                                ! kill cmd stream.
 497           RETURN
 498 C
 499 30300     IF(OBJACT(X)) RETURN                              ! obj handle?
 500           CALL RSPSUB(423,ODO2)                             ! describe.
 501           AVEHIC(WINNER)=PRSO
 502           IF(WINNER.NE.PLAYER) CALL NEWSTA(AOBJ(WINNER),0,0,PRSO,0)
 503           RETURN
 504 C
 505 C V131--  Disembark
 506 C
 507 31000     IF(AV.EQ.PRSO) GO TO 31100              ! from vehicle?
 508           CALL RSPEAK(424)                        ! no, joke.
 509           PRSCON=0                                ! kill cmd stream.
 510           RETURN
 511 C
 512 31100     IF(OBJACT(X)) RETURN                              ! obj handle?
 513 C old     IF((RFLAG(HERE).AND.RLAND).NE.0) GO TO 31200
 514           IF(AND(RFLAG(HERE),RLAND).NE.0) GO TO 31200
 515           CALL RSPEAK(425)                        ! not on land.
 516           PRSCON=0                                ! kill cmd stream.
 517           RETURN
 518 C
 519 31200     AVEHIC(WINNER)=0
 520           CALL RSPEAK(426)
 521           IF(WINNER.NE.PLAYER) CALL NEWSTA(AOBJ(WINNER),0,HERE,0,0)
 522           RETURN
 523 C
 524 C V132--  Take
 525 C
 526 32000     VAPPLI=TAKE(.TRUE.)
 527           RETURN
 528 C
 529 C V133--  Inventory
 530 C
 531 33000     CALL INVENT(WINNER)
 532           RETURN
 533 C page
 534 C VAPPLI, PAGE 8
 535 C
 536 C V134--  Fill
 537 C
 538 34000     IF(PRSI.NE.0) GO TO 34050               ! any obj specified?
 539 C old     IF((RFLAG(HERE).AND.(RWATER+RFILL)).NE.0) GO TO 34025
 540           IF(AND(RFLAG(HERE),(RWATER+RFILL)).NE.0) GO TO 34025
 541           CALL RSPEAK(516)                        ! nothing to fill with.
 542           PRSWON=.FALSE.                                    ! you lose.
 543           CALL ORPHAN(-1,ACT,PREP1,PRSO,2,' ',0,0)! orphan "fill obj with"
 544           GO TO 10                                ! return false.
 545 C
 546 34025     PRSI=GWATE                                        ! use global water.
 547 34050     PRSA=PUTW
 548           I=PRSO                                            ! fill x with y becomes
 549           PRSO=PRSI                               ! put y in x
 550           PRSI=I
 551           VAPPLI=PUT(.TRUE.)
 552           RETURN
 553 C
 554 C V135,V136--       Eat/Drink
 555 C
 556 35000     CONTINUE
 557 36000     IF(OBJACT(X)) RETURN                              ! obj handle?
 558           IF(PRSO.EQ.GWATE) GO TO 36500           ! drink global water?
 559           IF(.NOT.EDIBLE(PRSO)) GO TO 36400       ! edible?
 560           IF(OADV(PRSO).EQ.WINNER) GO TO 36200    ! yes, on winner?
 561 36100     CALL RSPSUB(454,ODO2)                             ! not accessible.
 562           RETURN
 563 C
 564 36200     IF(PRSA.EQ.DRINKW) GO TO 36300                    ! drink food?
 565           CALL NEWSTA(PRSO,455,0,0,0)             ! no, it disappears.
 566           RETURN
 567 C
 568 36300     CALL RSPEAK(456)                        ! yes, joke.
 569           RETURN
 570 C
 571 36400     IF(.NOT.DRKBLE(PRSO)) GO TO 36600       ! drinkable?
 572           IF(OCAN(PRSO).EQ.0) GO TO 36100                   ! yes, in something?
 573           IF(OADV(OCAN(PRSO)).NE.WINNER) GO TO 36100
 574           IF(QOPEN(OCAN(PRSO))) GO TO 36500       ! cont open?
 575           CALL RSPEAK(457)                        ! no, joke.
 576           RETURN
 577 C
 578 36500     CALL NEWSTA(PRSO,458,0,0,0)             ! gone.
 579           RETURN
 580 C
 581 36600     CALL RSPSUB(453,ODO2)                             ! not food or drink.
 582           RETURN
 583 C
 584 C V137--  Burn
 585 C
 586 C old 37000         IF((OFLAG1(PRSI).AND.(FLAMBT+LITEBT+ONBT)).NE.
 587 C old     &         (FLAMBT+LITEBT+ONBT)) GO TO 37600       ! with flame?
 588 37000     IF(AND(OFLAG1(PRSI),(FLAMBT+LITEBT+ONBT)).NE.
 589           &         (FLAMBT+LITEBT+ONBT)) GO TO 37600       ! with flame?
 590           IF(OBJACT(X)) RETURN                              ! obj handle?
 591 C old     IF((OFLAG1(PRSO).AND.BURNBT).EQ.0) GO TO 37500    ! burnable?
 592           IF(AND(OFLAG1(PRSO),BURNBT).EQ.0) GO TO 37500     ! burnable?
 593           IF(OADV(PRSO).EQ.WINNER) GO TO 37400    ! carrying it?
 594           IF(QHERE(PRSO,HERE)) GO TO 37200        ! here?
 595           J=OCAN(PRSO)                                      ! get container.
 596           IF(J.EQ.0) GO TO 37100                            ! is there one?
 597           IF(.NOT.QOPEN(J)) GO TO 37100           ! open?
 598           IF(J.EQ.RECEP) GO TO 37300              ! in balloon receptacle?
 599           IF(OADV(J).EQ.WINNER) GO TO 37400       ! carrying?
 600           IF(QHERE(J,HERE)) GO TO 37200           ! here?
 601 37100     CALL RSPEAK(461)                        ! cant reach it.
 602           RETURN
 603 C
 604 37200     CALL RSPSUB(462,ODO2)                             ! burn it.
 605           CALL NEWSTA(PRSO,0,0,0,0)
 606           RETURN
 607 C
 608 37300     VAPPLI=OAPPLI(OACTIO(BALLO),0)                    ! fire in receptacle.
 609           RETURN
 610 C
 611 37400     CALL RSPSUB(459,ODO2)                             ! burnable on player.
 612           CALL JIGSUP(460)
 613           RETURN
 614 C
 615 37500     CALL RSPSUB(463,ODO2)                             ! cant burn it.
 616           RETURN
 617 C
 618 37600     CALL RSPSUB(301,ODI2)                             ! cant burn it with that.
 619           RETURN
 620 C page
 621 C VAPPLI, PAGE 9
 622 C
 623 C V138--  Mung
 624 C
 625 38000     I=466                                             ! choose phrase.
 626 C old     IF((OFLAG2(PRSO).AND.VILLBT).NE.0) GO TO 41100
 627           IF(AND(OFLAG2(PRSO),VILLBT).NE.0) GO TO 41100
 628           IF(.NOT.OBJACT(X)) CALL RSPSB2(466,ODO2,RMK)
 629           RETURN
 630 C
 631 C V139--  Kill
 632 C
 633 39000     I=467                                             ! choose phrase.
 634           GO TO 41100
 635 C
 636 C V140--  Swing
 637 C
 638 40000     J=PRSO                                            ! invert.
 639           PRSO=PRSI
 640           PRSI=J
 641           J=ODO2
 642           ODO2=ODI2
 643           ODI2=J
 644           PRSA=ATTACW                                       ! for objact.
 645 C
 646 C V141--  Attack
 647 C
 648 41000     I=468
 649 C
 650 C Common mung/attack/swing/kill code.
 651 C
 652 41100     IF(PRSO.NE.0) GO TO 41200               ! anything?
 653           CALL RSPEAK(469)                        ! no, joke.
 654           RETURN
 655 C
 656 41200     IF(OBJACT(X)) RETURN                              ! obj handle?
 657 C old     IF((OFLAG2(PRSO).AND.VILLBT).NE.0) GO TO 41300
 658           IF(AND(OFLAG2(PRSO),VILLBT).NE.0) GO TO 41300
 659 C old     IF((OFLAG1(PRSO).AND.VICTBT).EQ.0)
 660 C old     &         CALL RSPSUB(470,ODO2)                   ! not a villain.
 661           IF(AND(OFLAG1(PRSO),VICTBT).EQ.0)
 662           &         CALL RSPSUB(470,ODO2)                   ! not a villain.
 663           RETURN
 664 C
 665 41300     J=471                                             ! assume no weapon.
 666           IF(PRSI.EQ.0) GO TO 41500
 667 C old     IF((OFLAG2(PRSI).AND.WEAPBT).EQ.0) GO TO 41400
 668           IF(AND(OFLAG2(PRSI),WEAPBT).EQ.0) GO TO 41400
 669           MELEE=1                                           ! assume sword.
 670           IF(PRSI.NE.SWORD) MELEE=2               ! must be knife.
 671           I=BLOW(PLAYER,PRSO,MELEE,.TRUE.,0)      ! strike blow.
 672           RETURN
 673 C
 674 41400     J=472                                             ! not a weapon.
 675 41500     CALL RSPSB2(I,ODO2,J)                             ! joke.
 676           RETURN
 677 C page
 678 C VAPPLI, PAGE 10
 679 C
 680 C V142--  Walk
 681 C
 682 42000     VAPPLI=WALK(X)
 683           RETURN
 684 C
 685 C V143--  Tell
 686 C
 687 43000     CALL RSPEAK(603)
 688           PRSCON=0                                ! kill cmd stream.
 689           RETURN
 690 C
 691 C V144--  Put
 692 C
 693 44000     VAPPLI=PUT(.TRUE.)
 694           RETURN
 695 C
 696 C V145,V148--       Drop/Throw
 697 C
 698 45000     CONTINUE                                ! throw.
 699 48000     VAPPLI=DROP(.TRUE.)                     ! drop.
 700           RETURN
 701 C
 702 C V146--  Give
 703 C
 704 46000     IF(OADV(PRSO).EQ.WINNER) GO TO 46100    ! is he carrying obj?
 705           X=OCAN(PRSO)                                      ! get container.
 706           IF(X.EQ.0) GO TO 46200                            ! container?
 707           IF(.NOT.QOPEN(X)) GO TO 46200           ! open?
 708           IF(OADV(X).NE.WINNER) GO TO 46200       ! carrying?
 709 46100     VAPPLI=OBJACT(X)                        ! iobject must handle.
 710           RETURN
 711 C
 712 46200     CALL RSPEAK(527)                        ! don't have it.
 713           RETURN
 714 C
 715 C V147--  Pour
 716 C
 717 47000     IF(PRSO.EQ.WATER) GO TO 47100           ! pour? must be water.
 718           CALL RSPEAK(1075)                       ! otherwise, joke.
 719           RETURN
 720 C
 721 47100     IF(PRSI.EQ.0) GO TO 48000               ! pour x, treat like drop.
 722           PRSA=PUTW                               ! else, treat like put.
 723           VAPPLI=PUT(.TRUE.)
 724           RETURN
 725 C
 726 C V149--  Save
 727 C
 728 C old 49000         IF((RFLAG(TSTRS).AND.RSEEN).EQ.0) GO TO 49100
 729 49000     IF(AND(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 49100
 730           CALL RSPEAK(828)                        ! no saves in endgame.
 731           RETURN
 732 C
 733 49100     CALL SAVEGM                                       ! save game.
 734           PRSWON=.FALSE.                                    ! disable rest of move.
 735           PRSCON=0
 736           RETURN
 737 C
 738 C V150--  Restore
 739 C
 740 C old 50000         IF((RFLAG(TSTRS).AND.RSEEN).EQ.0) GO TO 50100
 741 50000     IF(AND(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 50100
 742           CALL RSPEAK(829)                        ! no restores in endgame.
 743           RETURN
 744 C
 745 50100     CALL RSTRGM                                       ! restore game.
 746           PRSWON=.FALSE.                                    ! disable rest of move.
 747           PRSCON=0
 748           RETURN
 749 C page
 750 C VAPPLI, PAGE 11
 751 C
 752 C V151--  Hello
 753 C
 754 51000     IF(PRSO.NE.0) GO TO 51100               ! any obj?
 755           CALL RSPEAK(346+RND(4))                           ! no, vanilla hello.
 756           RETURN
 757 C
 758 51100     IF(PRSO.NE.AVIAT) GO TO 51200           ! hello aviator?
 759           CALL RSPEAK(350)                        ! nothing happens.
 760           RETURN
 761 C
 762 51200     IF(PRSO.NE.SAILO) GO TO 51300           ! hello sailor?
 763           HS=HS+1                                           ! count.
 764           I=351                                             ! give normal or
 765           IF(MOD(HS,10).EQ.0) I=352               ! random message.
 766           IF(MOD(HS,20).EQ.0) I=353
 767           CALL RSPEAK(I)                                    ! speak up.
 768           RETURN
 769 C
 770 51300     IF(OBJACT(X)) RETURN                              ! obj handle?
 771           I=354                                             ! assume villain.
 772 C old     IF((OFLAG2(PRSO).AND.(VILLBT+ACTRBT)).EQ.0) I=355
 773           IF(AND(OFLAG2(PRSO),(VILLBT+ACTRBT)).EQ.0) I=355
 774           CALL RSPSUB(I,ODO2)                     ! hello there!
 775           RETURN
 776 C
 777 C V152--  Look into
 778 C
 779 52000     IF(OBJACT(X)) RETURN                              ! obj handle?
 780 C old     IF((OFLAG1(PRSO).AND.DOORBT).EQ.0) GO TO 52300    ! door?
 781           IF(AND(OFLAG1(PRSO),DOORBT).EQ.0) GO TO 52300     ! door?
 782           IF(.NOT.QOPEN(PRSO)) GO TO 52200        ! open?
 783           CALL RSPSUB(628,ODO2)                             ! open door- uninteresting.
 784           RETURN
 785 C
 786 52200     CALL RSPSUB(525,ODO2)                             ! closed door- cant see.
 787           RETURN
 788 C
 789 C old 52300         IF((OFLAG1(PRSO).AND.CONTBT).NE.0) GO TO 52500    ! container?
 790 52300     IF(AND(OFLAG1(PRSO),CONTBT).NE.0) GO TO 52500     ! container?
 791           IF(QOPEN(PRSO)) GO TO 52400             ! open anyway?
 792           CALL RSPSUB(630,ODO2)                             ! cant look inside.
 793           RETURN
 794 C
 795 52400     IF(.NOT.QEMPTY(PRSO)) GO TO 52700       ! not empty?
 796           CALL RSPSUB(1054,ODO2)                            ! doesn't contain anything.
 797           RETURN
 798 C
 799 C old 52500         IF(QOPEN(PRSO).OR.((OFLAG1(PRSO).AND.TRANBT).NE.0))
 800 C old     &         GO TO 52600                             ! open or see inside?
 801 52500     IF(QOPEN(PRSO).OR.(AND(OFLAG1(PRSO),TRANBT).NE.0))
 802           &         GO TO 52600                             ! open or see inside?
 803           CALL RSPSUB(525,ODO2)                             ! closed.
 804           RETURN
 805 C
 806 52600     IF(QEMPTY(PRSO)) GO TO 52800            ! see in.  empty?
 807 52700     CALL PRINCO(PRSO,573,.TRUE.)            ! no, list contents.
 808           RETURN
 809 C
 810 52800     CALL RSPSUB(629,ODO2)                             ! empty.
 811           RETURN
 812 C page
 813 C VAPPLI, PAGE 12
 814 C
 815 C V153--  Look under
 816 C
 817 53000     IF(.NOT.OBJACT(X)) CALL RSPEAK(631)     ! object handle?
 818           RETURN
 819 C
 820 C V154--  Pump
 821 C
 822 54000     IF((OROOM(PUMP).EQ.HERE).OR.(OADV(PUMP).EQ.WINNER))
 823           &         GO TO 54100                             ! pump here?
 824           CALL RSPEAK(632)                        ! no.
 825           RETURN
 826 C
 827 54100     PRSI=PUMP                               ! becomes inflate
 828           PRSA=INFLAW                                       ! x with pump.
 829           GO TO 2000                                        ! done.
 830 C
 831 C V155--  Wind
 832 C
 833 55000     IF(.NOT.OBJACT(X)) CALL RSPSUB(634,ODO2)          ! obj handle?
 834           RETURN
 835 C
 836 C V156--  Climb
 837 C V157--  Climb up
 838 C V158--  Climb down
 839 C
 840 56000     CONTINUE
 841 57000     CONTINUE
 842 58000     IF(OBJACT(X)) RETURN                              ! object handle?
 843           I=XUP                                             ! assume up.
 844           IF(PRSA.EQ.CLMBDW) I=XDOWN              ! unless climb dn.
 845 C old     F=(OFLAG2(PRSO).AND.CLMBBT).NE.0
 846           F=AND(OFLAG2(PRSO),CLMBBT).NE.0
 847           IF(F.AND.FINDXT(I,HERE)) GO TO 58500    ! anything to climb?
 848           I=657
 849           IF(F) I=524                                       ! variety of jokes.
 850           IF(.NOT.F .AND.((PRSO.EQ.WALL).OR.(PRSO.EQ.GRWAL).OR.
 851           &         ((PRSO.GE.WNORT).AND.(PRSO.LE.WNORT+3))))
 852           &         I=656                                   ! if walls.
 853           CALL RSPEAK(I)                                    ! joke.
 854           RETURN
 855 C
 856 58500     PRSA=WALKW                                        ! walk
 857           PRSO=I                                            ! in specified dir.
 858           GO TO 42000                                       ! treat as walk.
 859 C page
 860 C VAPPLI, PAGE 13
 861 C
 862 C V160--  Pour on
 863 C
 864 60000     IF(PRSO.NE.WATER) GO TO 60500           ! pour water?
 865           IF(OBJACT(X)) RETURN                              ! object handle?
 866           CALL NEWSTA(WATER,0,0,0,0)              ! vanish water.
 867           IF(OCAN(PRSI).NE.RECEP) GO TO 60100     ! onto obj in receptacle?
 868           CALL RSPSUB(977,ODI2)                             ! doesn't work.
 869           RETURN
 870 C
 871 C old 60100         IF((OFLAG1(PRSI).AND.(LITEBT+FLAMBT+ONBT)).NE.
 872 60100     IF(AND(OFLAG1(PRSI),(LITEBT+FLAMBT+ONBT)).NE.
 873           &         (LITEBT+FLAMBT+ONBT)) GO TO 60300       ! on flame?
 874           IF(PRSI.NE.TORCH) GO TO 60200           ! on torch?
 875           CALL RSPEAK(978)                        ! doesn't work.
 876           RETURN
 877 C
 878 C old 60200         OFLAG1(PRSI)=OFLAG1(PRSI).AND..NOT.ONBT ! extinguish.
 879 60200     OFLAG1(PRSI)=AND(OFLAG1(PRSI),COMPL(ONBT))        ! extinguish.
 880           CALL RSPSUB(979,ODI2)                             ! describe.
 881           IF(PRSI.EQ.CANDL) CFLAG(CEVCND)=.FALSE. ! if candle, disable timer.
 882           IF(PRSI.EQ.MATCH) CTICK(CEVMAT)=0       ! if match, gone.
 883           GO TO 50                                ! go see if now dark.
 884 C
 885 60300     CALL RSPSUB(980,ODI2)                             ! doesn't work.
 886           RETURN
 887 C
 888 60500     CALL RSPEAK(981)                        ! not water, joke.
 889           RETURN
 890 C
 891 C V161--  Put under
 892 C
 893 61000     IF(OBJACT(X)) RETURN                              ! object handle.
 894           I=1037                                            ! can't do.
 895 C old     IF((OFLAG1(PRSO).AND.DOORBT).NE.0) I=982          ! if door, won't fit.
 896           IF(AND(OFLAG1(PRSO),DOORBT).NE.0) I=982 ! if door, won't fit.
 897           CALL RSPEAK(I)
 898           RETURN
 899 C
 900 C V162--  Untie from
 901 C
 902 62000     IF(((PRSO.EQ.BROPE).AND.(BTIEF.NE.0)).OR.
 903           &  ((PRSO.EQ.ROPE).AND.(TTIE.EQ.PRSI)).OR.
 904           &  ((PRSO.EQ.ROPE).AND.(PRSI.EQ.RAILI).AND.DOMEF))
 905           &  GO TO 62100                                    ! untie rope?
 906           CALL RSPEAK(1070)                       ! not attached to that.
 907           RETURN
 908 C
 909 62100     PRSA=UNTIEW                                       ! treat as normal untie.
 910           GO TO 13000
 911 C page
 912 C VAPPLI, PAGE 14
 913 C
 914 C V163--  Make
 915 C V169--  Wish
 916 C
 917 63000     IF(PRSO.NE.GWISH) GO TO 10              ! make a wish?
 918 69000     IF(HERE.NE.BWELL) GO TO 63100           ! at well?
 919           IF(OROOM(BAGCO).EQ.HERE) GO TO 63200    ! coins here?
 920           IF(OROOM(ZORKM).EQ.HERE) GO TO 63300    ! zorkmid here?
 921 63100     CALL RSPEAK(937)                        ! doesn't work.
 922           RETURN
 923 C
 924 63200     CALL NEWSTA(BAGCO,938,0,0,0)            ! vanish coins
 925           RETURN
 926 C
 927 63300     CALL NEWSTA(ZORKM,938,0,0,0)            ! vanish zorkmid.
 928           RETURN
 929 C
 930 C V164--  Oil
 931 C
 932 64000     IF(PRSI.NE.PUTTY) GO TO 64100           ! with putty?
 933           IF(OBJACT(X)) RETURN                              ! object handle?
 934           CALL RSPEAK(904)                        ! doesn't work.
 935           RETURN
 936 C
 937 64100     CALL RSPEAK(905)                        ! joke.
 938           RETURN
 939 C
 940 C V165--  Play
 941 C
 942 65000     IF(PRSO.NE.STRAD) GO TO 65200           ! play violin?
 943           IF(PRSI.EQ.0) GO TO 65100               ! with anything?
 944 C old     IF((OFLAG2(PRSI).AND.WEAPBT).EQ.0) GO TO 65100
 945           IF(AND(OFLAG2(PRSI),WEAPBT).EQ.0) GO TO 65100
 946           OTVAL(STRAD)=0                                    ! with weapon, ruined.
 947           CALL RSPEAK(933)
 948           RETURN
 949 C
 950 65100     CALL RSPEAK(934)                        ! offensive noise.
 951           RETURN
 952 C
 953 C old 65200         IF((OFLAG2(PRSO).AND.VILLBT).EQ.0) GO TO 10       ! play villain?
 954 65200     IF(AND(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 10        ! play villain?
 955           CALL RSPSUB(935,ODO2)                             ! you're dead.
 956           CALL JIGSUP(0)
 957           RETURN
 958 C
 959 C V166--  Send
 960 C
 961 66000     IF(OBJACT(X)) RETURN                              ! object handle?
 962           I=940                                             ! can't do it.
 963 C old     IF((OFLAG2(PRSO).AND.VILLBT).NE.0) I=941 ! why do it?
 964           IF(AND(OFLAG2(PRSO),VILLBT).NE.0) I=941 ! why do it?
 965           CALL RSPSUB(I,ODO2)
 966           RETURN
 967 C page
 968 C VAPPLI, PAGE 15
 969 C
 970 C V167--  Enter
 971 C
 972 67000     PRSA=WALKW                                        ! treat as walk.
 973           PRSO=XENTER
 974           GO TO 42000
 975 C
 976 C V168--  Leave
 977 C
 978 68000     PRSA=WALKW                                        ! treat as walk.
 979           PRSO=XEXIT
 980           GO TO 42000
 981 C
 982 C V65--   Room
 983 C
 984 65001     VAPPLI=RMDESC(2)                        ! describe room only.
 985           RETURN
 986 C
 987 C V66--   Objects
 988 C
 989 66001     VAPPLI=RMDESC(1)                        ! describe obj only.
 990           IF(.NOT.TELFLG) CALL RSPEAK(138)        ! no objects.
 991           RETURN
 992 C
 993 C V67--   Rname
 994 C
 995 67001     CALL RSPEAK(RDESC2-HERE)                ! short room name.
 996           RETURN
 997 C
 998 C V68--   Squeeze
 999 C
1000 68001     IF(OBJACT(X)) RETURN                              ! object handle?
1001           I=901                                             ! can't.
1002 C old     IF((OFLAG2(PRSO).AND.VILLBT).NE.0) I=902 ! don't understand.
1003           IF(AND(OFLAG2(PRSO),VILLBT).NE.0) I=902 ! don't understand.
1004           CALL RSPSUB(I,ODO2)
1005           RETURN
1006 C
1007 C V69--   Smell
1008 C
1009 69001     CALL RSPSUB(903,ODO2)                             ! joke.
1010           RETURN
1011 C page
1012 C VAPPLI, PAGE 16
1013 C
1014 C V70--   Brief
1015 C
1016 70000     BRIEFF=.TRUE.                                     ! brief descriptions.
1017           SUPERF=.FALSE.
1018           CALL RSPEAK(326)
1019           RETURN
1020 C
1021 C V71--   Verbose
1022 C
1023 71000     BRIEFF=.FALSE.                                    ! long descriptions.
1024           SUPERF=.FALSE.
1025           CALL RSPEAK(327)
1026           RETURN
1027 C
1028 C V72--   Superbrief
1029 C
1030 72000     SUPERF=.TRUE.
1031           CALL RSPEAK(328)
1032           RETURN
1033 C
1034 C V73-- Stay (used in endgame)
1035 C
1036 73000     IF(WINNER.NE.AMASTR) GO TO 73100        ! tell master, stay.
1037           CALL RSPEAK(781)                        ! he does.
1038           CTICK(CEVFOL)=0                                   ! not following.
1039           RETURN
1040 C
1041 73100     IF(WINNER.EQ.PLAYER) CALL RSPEAK(664)   ! joke.
1042           RETURN
1043 C
1044 C V74--   Version
1045 C
1046 74000     WRITE(OUTCH,74010) VMAJ,VMIN,VEDIT
1047 74010     FORMAT(' V',I1,'.',I1,A)
1048           TELFLG=.TRUE.
1049           RETURN
1050 C
1051 C V75--   Swim
1052 C
1053 75000     I=330                                             ! assume water.
1054 C old     IF((RFLAG(HERE).AND.(RWATER+RFILL)).EQ.0)
1055 C old     &         I=331+RND(3)                            ! if no water, joke.
1056           IF(AND(RFLAG(HERE),(RWATER+RFILL)).EQ.0)
1057           &         I=331+RND(3)                            ! if no water, joke.
1058           CALL RSPEAK(I)
1059           RETURN
1060 C
1061 C V76--   Geronimo
1062 C
1063 76000     IF(AVEHIC(WINNER).EQ.BARRE) GO TO 76100 ! in barrel?
1064           CALL RSPEAK(334)                        ! no, joke.
1065           RETURN
1066 C
1067 76100     CALL JIGSUP(335)                        ! over falls.
1068           RETURN
1069 C
1070 C V77--   Sinbad et al
1071 C
1072 77000     IF((HERE.EQ.MCYCL).AND.(OROOM(CYCLO).EQ.HERE)) GO TO 77100
1073           CALL RSPEAK(336)                        ! not here, joke.
1074           RETURN
1075 C
1076 77100     CALL NEWSTA(CYCLO,337,0,0,0)            ! cyclops flees.
1077           CYCLOF=.TRUE.                                     ! set all flags.
1078           MAGICF=.TRUE.
1079 C old     OFLAG2(CYCLO)=OFLAG2(CYCLO).AND. .NOT.FITEBT
1080           OFLAG2(CYCLO)=AND(OFLAG2(CYCLO), COMPL(FITEBT))
1081           RETURN
1082 C
1083 C V78--   unused
1084 C
1085 78000     GO TO 10
1086 C
1087 C V79--   Pray
1088 c
1089 79000     IF(HERE.NE.TEMP2) GO TO 79050           ! in temple?
1090           IF(MOVETO(FORE1,WINNER)) GO TO 79100    ! fore1 still there?
1091 79050     CALL RSPEAK(340)                        ! joke.
1092           RETURN
1093 C
1094 79100     F=RMDESC(3)                                       ! moved, describe.
1095           RETURN
1096 C
1097 C V80--   Treasure
1098 c
1099 80000     IF(HERE.NE.TEMP1) GO TO 80050           ! in temple?
1100           IF(MOVETO(TREAS,WINNER)) GO TO 79100    ! treasure room there?
1101 80050     CALL RSPEAK(341)                        ! nothing happens.
1102           RETURN
1103 C
1104 C V81--   Temple
1105 c
1106 81000     IF(HERE.NE.TREAS) GO TO 81050           ! in treasure?
1107           IF(MOVETO(TEMP1,WINNER)) GO TO 79100    ! temp1 still there?
1108 81050     CALL RSPEAK(341)                        ! nothing happens.
1109           RETURN
1110 C
1111 C V82--   Blast
1112 C
1113 82000     I=342                                             ! dont understand.
1114           IF(PRSO.EQ.SAFE) I=252                            ! joke for safe.
1115           CALL RSPEAK(I)
1116           RETURN
1117 C
1118 C V83--   Score
1119 C
1120 83000     CALL SCORE(.FALSE.)
1121           RETURN
1122 C
1123 C V84--   Quit
1124 C
1125 84000     CALL SCORE(.TRUE.)                      ! tell score.
1126           IF(.NOT.YESNO(343,10,0)) RETURN                   ! ask for y/n decision.
1127           CALL EXIT                               ! bye.
1128 C page
1129 C VAPPLI, PAGE 17
1130 C
1131 C V85--   Follow (used in endgame)
1132 C
1133 85000     IF(WINNER.NE.AMASTR) GO TO 85100        ! tell master, follow.
1134           CALL RSPEAK(782)
1135           CFLAG(CEVFOL)=.TRUE.
1136           CTICK(CEVFOL)=-1                        ! starts following.
1137           RETURN
1138 C
1139 85100     I=10                                              ! assume ok.
1140           IF(PRSO.EQ.0) GO TO 85200               ! any object?
1141           I=964                                             ! joke 1
1142 C old     IF((OFLAG2(PRSO).AND.VILLBT).NE.0) I=965 ! joke 2.
1143           IF(AND(OFLAG2(PRSO),VILLBT).NE.0) I=965 ! joke 2.
1144 85200     CALL RSPEAK(I)
1145           RETURN
1146 C
1147 C V86--   Walk through
1148 C
1149 86000     IF(OBJACT(X)) RETURN                              ! object handle?
1150           IF((SCOLRM.EQ.0).OR.((PRSO.NE.SCOL).AND.
1151           &         ((PRSO.NE.WNORT).OR.(HERE.NE.BKBOX)))) GO TO 86100
1152           SCOLAC=SCOLRM                                     ! walked thru scol.
1153           PRSO=0                                            ! fake out fromdr.
1154           CFLAG(CEVSCL)=.TRUE.
1155           CTICK(CEVSCL)=6                                   ! start alarm.
1156           CALL RSPEAK(668)                        ! disorient him.
1157           F=MOVETO(SCOLRM,WINNER)                           ! into room.
1158           F=RMDESC(0)                                       ! describe.
1159           RETURN
1160 C
1161 86100     IF(HERE.NE.SCOLAC) GO TO 86300                    ! on other side of scol?
1162           DO 86200 I=1,12,3                       ! walk thru proper wall?
1163             IF((SCOLWL(I).EQ.HERE).AND.(SCOLWL(I+1).EQ.PRSO))
1164           &         GO TO 86500                             ! in specified room?
1165 86200     CONTINUE
1166 C
1167 C old 86300         IF((OFLAG1(PRSO).AND.TAKEBT).NE.0) GO TO 86400    ! tkble?
1168 86300     IF(AND(OFLAG1(PRSO),TAKEBT).NE.0) GO TO 86400     ! tkble?
1169           I=669                                             ! no, joke.
1170           IF(PRSO.EQ.SCOL) I=670                            ! special joke for scol.
1171           CALL RSPSUB(I,ODO2)
1172           RETURN
1173 C
1174 86400     I=671                                             ! joke.
1175           IF(OROOM(PRSO).NE.0) I=552+RND(6)       ! special jokes if carry.
1176           CALL RSPEAK(I)
1177           RETURN
1178 C
1179 86500     PRSO=SCOLWL(I+2)                        ! thru scol wall...
1180           DO 86600 I=1,8,2                        ! find matching room.
1181             IF(PRSO.EQ.SCOLDR(I)) SCOLRM=SCOLDR(I+1)
1182 86600     CONTINUE                                ! declare new scolrm.
1183           CTICK(CEVSCL)=0                                   ! cancel alarm.
1184           CALL RSPEAK(668)                        ! disorient him.
1185           F=MOVETO(BKBOX,WINNER)                            ! back in box room.
1186           F=RMDESC(0)
1187           RETURN
1188 C
1189 C V87--   Ring
1190 C
1191 87000     IF(OBJACT(X)) RETURN                              ! object handle?
1192           I=359                                             ! cant ring.
1193           IF(PRSO.EQ.BELL) I=360                            ! ding, dong.
1194           CALL RSPEAK(I)                                    ! joke.
1195           RETURN
1196 C
1197 C V88--   Brush
1198 C
1199 88000     IF(PRSO.EQ.TEETH) GO TO 88100           ! brush teeth?
1200           CALL RSPEAK(362)                        ! no, joke.
1201           RETURN
1202 C
1203 88100     IF(PRSI.NE.0) GO TO 88200               ! with something?
1204           CALL RSPEAK(363)                        ! no, joke.
1205           RETURN
1206 C
1207 88200     IF((PRSI.EQ.PUTTY).AND.(OADV(PUTTY).EQ.WINNER))
1208           &         GO TO 88300                             ! with putty?
1209           CALL RSPSUB(364,ODI2)                             ! no, joke.
1210           RETURN
1211 C
1212 88300     CALL JIGSUP(365)                        ! yes, dead!!!!!
1213           RETURN
1214 C page
1215 C VAPPLI, PAGE 18
1216 C
1217 C V89--   Dig
1218 C
1219 89000     IF(PRSI.NE.SHOVE) GO TO 89100           ! shovel?
1220           VAPPLI=OBJACT(X)                        ! must handle.
1221           RETURN
1222 C
1223 89100     I=392                                             ! assume tool.
1224 C old     IF((OFLAG1(PRSI).AND.TOOLBT).EQ.0) I=393
1225           IF(AND(OFLAG1(PRSI),TOOLBT).EQ.0) I=393
1226           CALL RSPSUB(I,ODI2)
1227           RETURN
1228 C
1229 C V90--   Time
1230 C
1231 90000     CALL GTTIME(K)                                    ! get play time.
1232           I=K/60
1233           J=MOD(K,60)
1234           WRITE(OUTCH,90010)
1235           IF(I.NE.0) WRITE(OUTCH,90011) I
1236           IF(I.GE.2) WRITE(OUTCH,90012)
1237           IF(I.EQ.1) WRITE(OUTCH,90013)
1238           IF(J.EQ.1) WRITE(OUTCH,90014) J
1239           IF(J.NE.1) WRITE(OUTCH,90015) J
1240           TELFLG=.TRUE.
1241           RETURN
1242 C
1243 90010     FORMAT(' You have been playing Dungeon for ',$)
1244 90011     FORMAT('+',I3,' hour',$)
1245 90012     FORMAT('+s and ',$)
1246 90013     FORMAT('+ and ',$)
1247 90014     FORMAT('+',I2,' minute.')
1248 90015     FORMAT('+',I2,' minutes.')
1249 C
1250 C V91--   Leap
1251 C
1252 91000     IF(PRSO.EQ.0) GO TO 91200               ! over something?
1253           IF(QHERE(PRSO,HERE)) GO TO 91100        ! here?
1254           CALL RSPEAK(447)                        ! no, joke.
1255           RETURN
1256 C
1257 C old 91100         IF((OFLAG2(PRSO).AND.VILLBT).EQ.0) GO TO 91300
1258 91100     IF(AND(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 91300
1259           CALL RSPSUB(448,ODO2)                             ! cant jump villain.
1260           RETURN
1261 C
1262 91200     IF(.NOT.FINDXT(XDOWN,HERE)) GO TO 91300 ! down exit?
1263           IF(XTYPE.EQ.XNO) GO TO 91400            ! invalid?
1264           IF(XTYPE.NE.XCOND) GO TO 91300                    ! conditional?
1265           IF(.NOT.FLAGS(XFLAG)) GO TO 91400       ! blocked off?
1266 91300     CALL RSPEAK(314+RND(5))                           ! wheeee!
1267           RETURN
1268 C
1269 91400     IF(WINNER.EQ.PLAYER) GO TO 91500        ! tell x, jump?
1270           CALL JIGSUP(452)                        ! Geronimo!
1271           RETURN
1272 C
1273 91500     CALL JIGSUP(449+RND(4))                           ! fatal leap.
1274           RETURN
1275 C page
1276 C VAPPLI, PAGE 19
1277 C
1278 C V92--   Lock
1279 C
1280 92000     IF(OBJACT(X)) RETURN                              ! object handle?
1281           IF((PRSO.EQ.GRATE).AND..NOT.QOPEN(GRATE).AND.(HERE.EQ.MGRAT))
1282           &         GO TO 92200                             ! lock closed grate?
1283 92100     CALL RSPEAK(464)                        ! not lock grate.
1284           RETURN
1285 C
1286 92200     GRUNLF=.FALSE.                                    ! grate now locked.
1287           CALL RSPEAK(214)
1288           TRAVEL(REXIT(HERE)+1)=214               ! change exit status.
1289           RETURN
1290 C
1291 C V93--   Unlock
1292 C
1293 93000     IF(OBJACT(X)) RETURN                              ! object handle?
1294           IF((PRSO.NE.GRATE).OR.(HERE.NE.MGRAT))
1295           &         GO TO 92100                             ! not unlock grate.
1296           IF(PRSI.EQ.KEYS) GO TO 93200            ! got keys?
1297           CALL RSPSUB(465,ODI2)                             ! no, joke.
1298           RETURN
1299 C
1300 93200     GRUNLF=.TRUE.                                     ! unlock grate.
1301           CALL RSPEAK(217)
1302           TRAVEL(REXIT(HERE)+1)=1041              ! change exit status.
1303           RETURN
1304 C
1305 C V94--   Diagnose
1306 C
1307 94000     I=FIGHTS(WINNER,.FALSE.)                ! get fights strength.
1308           J=ASTREN(WINNER)                        ! get health.
1309           K=MIN0(I+J,4)                                     ! get state.
1310           IF(.NOT.CFLAG(CEVCUR)) J=0              ! if no wounds.
1311           L=MIN0(4,IABS(J))                       ! scale.
1312           CALL RSPEAK(473+L)                      ! describe health.
1313           I=(30*(-J-1))+CTICK(CEVCUR)             ! compute wait.
1314           IF(J.NE.0) WRITE(OUTCH,94100) I
1315 94100     FORMAT(' You will be cured after ',I3,' moves.')
1316           CALL RSPEAK(478+K)                      ! how much more?
1317           IF(DEATHS.NE.0) CALL RSPEAK(482+DEATHS) ! how many deaths?
1318           RETURN
1319 C page
1320 C VAPPLI, PAGE 20
1321 C
1322 C V95--   Incant
1323 C
1324 95000     IF(WINNER.NE.PLAYER) GO TO 10           ! must do yourself.
1325 C old     IF((RFLAG(MREYE).AND.RSEEN).NE.0) GO TO 95800     ! too late?
1326           IF(AND(RFLAG(MREYE),RSEEN).NE.0) GO TO 95800      ! too late?
1327           IF(SUBLNT.EQ.0) GO TO 95350             ! any input?
1328           PW(1)=' '                               ! set up parse.
1329           PW(2)=' '
1330           WP=1
1331           CP=1
1332           DO 95200 I=1,SUBLNT                     ! scan substring
1333             IF(SUBBUF(I:I).NE.' ') GO TO 95150    ! blank?
1334             IF(CP.EQ.1) GO TO 95200               ! anything in word yet?
1335             WP=MIN0(2,WP+1)                       ! advance word pointer.
1336             CP=1                                            ! reset char pointer.
1337             GO TO 95200
1338 95150       IF(CP.LE.WRDLNT) PW(WP)(CP:CP)=SUBBUF(I:I)      ! add char to word.
1339             CP=CP+1
1340 95200     CONTINUE
1341 C
1342           IF(PW(1).NE.' ') GO TO 95400            ! any input?
1343 95350     CALL RSPEAK(856)                        ! no, ho hum.
1344 95375     PRSCON=0                                ! kill cmd stream.
1345           RETURN
1346 C
1347 95400     CALL ENCRYP(PW(1),CH)                             ! compute response.
1348           IF(PW(2).NE.' ') GO TO 95600            ! two phrases?
1349 C
1350           IF(SPELLF) GO TO 95550                            ! he's trying to learn.
1351 C old     IF((RFLAG(TSTRS).AND.RSEEN).EQ.0) GO TO 95575     ! really in end game?
1352           IF(AND(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 95575      ! really in end game?
1353           SPELLF=.TRUE.                                     ! tell him.
1354           TELFLG=.TRUE.
1355           WRITE(OUTCH,95510) PW(1)(1:NBLEN(PW(1))),CH
1356 95510     FORMAT(' A hollow voice replies: "',A,1X,A,'".')
1357           RETURN
1358 C
1359 95550     CALL RSPEAK(857)                        ! he's got one already.
1360           GO TO 95375
1361 C
1362 95575     CALL RSPEAK(858)                        ! he's not in endgame.
1363           GO TO 95375
1364 C
1365 95600     CALL ENCRYP(PW(2),CH2)                            ! try both ways.
1366           IF(SPELLF.OR.((PW(1).NE.CH2).AND.(PW(2).NE.CH)))
1367           &  GO TO 95900                                    ! wrong or second use.
1368           SPELLF=.TRUE.                                     ! it works.
1369           CALL RSPEAK(859)
1370           CFLAG(CEVSTE)=.TRUE.
1371           CTICK(CEVSTE)=1                                   ! force start.
1372           RETURN
1373 C
1374 95800     CALL RSPEAK(855)                        ! too late.
1375           GO TO 95375
1376 C
1377 95900     CALL RSPEAK(1052)                       ! got it wrong.
1378           GO TO 95375
1379 C page
1380 C VAPPLI, PAGE 21
1381 C
1382 C V96--   Answer
1383 C
1384 96000     IF(WINNER.NE.PLAYER) GO TO 10           ! must answer for himself.
1385           IF(SUBLNT.EQ.0) GO TO 96050             ! any substring?
1386           IF((HERE.EQ.RIDDL).AND..NOT.RIDDLF) GO TO 96700   ! riddle room?
1387           IF(HERE.EQ.FDOOR) GO TO 96100           ! end game front door?
1388 96050     CALL RSPEAK(799)                        ! no one listens.
1389           PRSCON=0                                ! kill cmd stream.
1390           RETURN
1391 C
1392 96100     IF(INQSTF.AND.(NQATT.LT.5).AND.(CORRCT.LT.3))
1393           &         GO TO 96200                             ! knocked, didn't lose or win?
1394           CALL RSPEAK(783)                        ! no reply.
1395           PRSCON=0                                ! kill cmd stream.
1396           RETURN
1397 C
1398 96200     DO 96300 J=1,NUMANS                     ! check answers.
1399             IF(QUESNO.NE.ANSWER(J)) GO TO 96300   ! only check proper ans.
1400             IF(SUBBUF.EQ.ANSSTR(J)(1:NBLEN(ANSSTR(J)))) GO TO 96500
1401 96300     CONTINUE
1402 C
1403           PRSCON=0                                ! kill cmd stream.
1404           NQATT=NQATT+1                                     ! wrong, cretin.
1405           IF(NQATT.GE.5) GO TO 96400              ! too many wrong?
1406           CALL RSPEAK(800+NQATT)                            ! no, try again.
1407           RETURN
1408 C
1409 96400     CALL RSPEAK(826)                        ! all over.
1410           CFLAG(CEVINQ)=.FALSE.                             ! lose.
1411           RETURN
1412 C
1413 96500     CORRCT=CORRCT+1                                   ! got it right.
1414           CALL RSPEAK(800)                        ! hooray.
1415           IF(CORRCT.GE.3) GO TO 96600             ! won totally?
1416           CFLAG(CEVINQ)=.TRUE.
1417           CTICK(CEVINQ)=2                                   ! no, start again.
1418           QUESNO=MOD(QUESNO+3,8)
1419           NQATT=0
1420           CALL RSPEAK(769)                        ! ask next question.
1421           CALL RSPEAK(770+QUESNO)
1422           RETURN
1423 C
1424 96600     CALL RSPEAK(827)                        ! quiz over,
1425           CFLAG(CEVINQ)=.FALSE.
1426 C old     OFLAG2(QDOOR)=OFLAG2(QDOOR).OR.OPENBT   ! open door.
1427           OFLAG2(QDOOR)=OR(OFLAG2(QDOOR),OPENBT)  ! open door.
1428           RETURN
1429 C
1430 96700     IF(SUBBUF.NE.'WELL') GO TO 96050        ! right answer?
1431           RIDDLF=.TRUE.                                     ! solved riddle.
1432           CALL RSPEAK(338)
1433           RETURN
1434 C page
1435 C V97-- Count (valuables, possessions in VALUAC)
1436 C
1437 97000     IF(PRSO.NE.MATCH) GO TO 97100           ! matches?
1438           IF(ORMTCH.EQ.1) WRITE(OUTCH,97010) ORMTCH         ! print number.
1439           IF(ORMTCH.NE.1) WRITE(OUTCH,97020) ORMTCH
1440 97010     FORMAT(' You have ',I1,' match.')
1441 97020     FORMAT(' You have ',I1,' matches.')
1442           TELFLG=.TRUE.
1443           RETURN
1444 C
1445 97100     I=1062                                            ! default.
1446           IF(PRSO.EQ.BAGCO) I=561                           ! bag of coins.
1447           IF(PRSO.EQ.CANDL) I=1058                ! candles.
1448           IF(PRSO.EQ.BILLS) I=1059                ! stack of bills.
1449           IF(PRSO.EQ.LEAVE) I=1060                ! pile of leaves.
1450           IF(PRSO.EQ.GWISH) I=1061                ! blessings.
1451           IF(PRSO.EQ.HEADS) I=1084                ! heads.
1452           CALL RSPEAK(I)                                    ! print response.
1453           RETURN
1454 C
1455           END
1456 C page
1457 C TAKE-- Basic take sequence
1458 C
1459 C Take an object (for verbs take, put, drop, read, etc.)
1460 C
1461           LOGICAL FUNCTION TAKE(FLG)
1462 C
1463 C Declarations
1464 C
1465           IMPLICIT INTEGER (A-Z)
1466           LOGICAL FLG,OBJACT,OAPPLI,QHERE
1467           %include dparam
1468 C page
1469 C TAKE, PAGE 2
1470 C
1471 C old     IF((PRSO.LE.STRBIT).AND.
1472 C old     & ((OFLAG2(PRSO).AND.NOCHBT).EQ.0)) GO TO 100     ! star or nocheck?
1473           IF((PRSO.LE.STRBIT).AND.
1474           & (AND(OFLAG2(PRSO),NOCHBT).EQ.0)) GO TO 100      ! star or nocheck?
1475           TAKE=OBJACT(X)                                    ! yes, let it handle.
1476           RETURN
1477 C
1478 100       TAKE=.FALSE.                                      ! assume loses.
1479           X=OCAN(PRSO)                                      ! inside?
1480           IF((PRSI.EQ.0).OR.(PRSI.EQ.X)) GO TO 200 ! take x from ocan(x)?
1481           CALL RSPEAK(1038)                       ! not in that.
1482           RETURN
1483 C
1484 200       IF(PRSO.NE.AVEHIC(WINNER)) GO TO 400    ! his vehicle?
1485           CALL RSPEAK(672)                        ! dummy.
1486           RETURN
1487 C
1488 C old 400 IF((OFLAG1(PRSO).AND.TAKEBT).NE.0) GO TO 500 ! takeable?
1489 400       IF(AND(OFLAG1(PRSO),TAKEBT).NE.0) GO TO 500 ! takeable?
1490           IF(.NOT.OAPPLI(OACTIO(PRSO),0)) CALL RSPEAK(552+RND(6))
1491           RETURN
1492 C
1493 C Object is takeable and in position to be taken.
1494 C
1495 500       IF((X.NE.0).OR. QHERE(PRSO,HERE)) GO TO 600
1496           I=103                                             ! assume player.
1497           IF(WINNER.NE.PLAYER) I=1080
1498           IF(OADV(PRSO).EQ.WINNER) CALL RSPEAK(I) ! already got it?
1499           RETURN
1500 C
1501 600       IF(X.EQ.0) GO TO 650                              ! contained?
1502           IF(OADV(X).EQ.WINNER) GO TO 700                   ! already carrying cont?
1503 650       IF((WEIGHR(PRSO,WINNER)+OSIZE(PRSO)).LE.MXLOAD)
1504           &         GO TO 700                     ! can he carry?
1505           I=558                                             ! assume player.
1506           IF(WINNER.NE.PLAYER) I=1079
1507           CALL RSPEAK(I)                                    ! too much weight.
1508           PRSCON=0                                ! kill cmd stream.
1509           RETURN
1510 C
1511 700       TAKE=.TRUE.                                       ! at last.
1512           IF(OAPPLI(OACTIO(PRSO),0)) RETURN       ! did it handle?
1513           CALL NEWSTA(PRSO,0,0,0,WINNER)                    ! take object for winner.
1514 C old     OFLAG2(PRSO)=OFLAG2(PRSO).OR.TCHBT      ! has been touched.
1515           OFLAG2(PRSO)=OR(OFLAG2(PRSO),TCHBT)     ! has been touched.
1516           CALL SCRUPD(OFVAL(PRSO))                ! update score.
1517           OFVAL(PRSO)=0                                     ! cant be scored again.
1518           IF(FLG) CALL RSPEAK(559)                ! tell taken.
1519           RETURN
1520 C
1521           END
1522 C page
1523 C DROP- Drop verb processor (also throw, pour water)
1524 C
1525 C Declarations
1526 C
1527           LOGICAL FUNCTION DROP(FLG)
1528           IMPLICIT INTEGER (A-Z)
1529           %include dparam
1530           LOGICAL F,PUT,OBJACT,FLG
1531 C
1532 C old     IF((OFLAG2(PRSO).AND.NOCHBT).EQ.0) GO TO 100
1533           IF(AND(OFLAG2(PRSO),NOCHBT).EQ.0) GO TO 100
1534           DROP=OBJACT(X)                                    ! no check, let obj handle.
1535           RETURN
1536 C
1537 100       DROP=.TRUE.                                       ! assume wins.
1538           X=OCAN(PRSO)                                      ! get container.
1539           IF(X.EQ.0) GO TO 200                              ! is it inside?
1540           IF(OADV(X).NE.WINNER) GO TO 1000        ! is he carrying con?
1541 C old     IF((OFLAG2(X).AND.OPENBT).NE.0) GO TO 300 ! is it open?
1542           IF(AND(OFLAG2(X),OPENBT).NE.0) GO TO 300 ! is it open?
1543           CALL RSPSUB(525,ODESC2(X))              ! cant reach.
1544           RETURN
1545 C
1546 200       IF(OADV(PRSO).NE.WINNER) GO TO 1000     ! is he carrying obj?
1547 300       IF(AVEHIC(WINNER).EQ.0) GO TO 400       ! is he in vehicle?
1548           PRSI=AVEHIC(WINNER)                     ! yes,
1549           F=PUT(.TRUE.)                                     ! drop into vehicle.
1550           PRSI=0                                            ! disarm parser.
1551           RETURN                                            ! done.
1552 C
1553 400       CALL NEWSTA(PRSO,0,HERE,0,0)            ! drop into room.
1554           CALL SCRUPD(OFVAL(PRSO))                ! score object.
1555           OFVAL(PRSO)=0                                     ! cant be scored again.
1556 C old     OFLAG2(PRSO)=OFLAG2(PRSO).OR.TCHBT      ! has been touched.
1557           OFLAG2(PRSO)=OR(OFLAG2(PRSO),TCHBT)     ! has been touched.
1558 C
1559           IF(OBJACT(X)) RETURN                              ! did it handle?
1560           IF(PRSA.EQ.DROPW) CALL RSPEAK(528)
1561           IF(PRSA.EQ.THROWW) CALL RSPEAK(529)
1562           RETURN
1563 C
1564 1000      I=527                                             ! assume player.
1565           IF(WINNER.NE.PLAYER) I=1078
1566           CALL RSPEAK(I)                                    ! dont have it.
1567           RETURN
1568 C
1569           END
1570 C page
1571 C PUT- Put verb processor
1572 C
1573 C Declarations
1574 C
1575           LOGICAL FUNCTION PUT(FLG)
1576           IMPLICIT INTEGER (A-Z)
1577           %include dparam
1578           LOGICAL QOPEN,QHERE,OBJACT,FLG,TAKE
1579 C
1580 C Functions and data
1581 C
1582 C old     QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
1583           QOPEN(R)=AND(OFLAG2(R),OPENBT).NE.0
1584 C page
1585 C PUT, PAGE 2
1586 C
1587 C old     IF((OFLAG2(PRSO).AND.NOCHBT).EQ.0) GO TO 100
1588           IF(AND(OFLAG2(PRSO),NOCHBT).EQ.0) GO TO 100
1589           PUT=OBJACT(X)                                     ! no check, let obj handle.
1590           RETURN
1591 C
1592 100       PUT=.FALSE.
1593           IF((PRSO.LE.STRBIT).AND.(PRSI.LE.STRBIT)) GO TO 200
1594           IF(.NOT.OBJACT(X)) CALL RSPEAK(560)     ! star
1595           PUT=.TRUE.
1596           RETURN
1597 C
1598 C old 200 IF(QOPEN(PRSI).OR.((OFLAG1(PRSI).AND.(DOORBT+CONTBT)).NE.0)
1599 C old     &         .OR.((OFLAG2(PRSI).AND.VEHBT).NE.0)) GO TO 300
1600 200       IF(QOPEN(PRSI).OR.(AND(OFLAG1(PRSI),(DOORBT+CONTBT)).NE.0)
1601           &         .OR.(AND(OFLAG2(PRSI),VEHBT).NE.0)) GO TO 300
1602           CALL RSPEAK(561)                        ! cant put in that.
1603           RETURN
1604 C
1605 300       IF(QOPEN(PRSI)) GO TO 400               ! is it open?
1606           CALL RSPEAK(562)                        ! no, joke
1607           RETURN
1608 C
1609 400       IF(PRSO.NE.PRSI) GO TO 500              ! into itself?
1610           CALL RSPEAK(563)                        ! yes, joke.
1611           RETURN
1612 C
1613 500       IF(OCAN(PRSO).NE.PRSI) GO TO 600        ! already inside.
1614           CALL RSPSB2(564,ODESC2(PRSO),ODESC2(PRSI))
1615           PUT=.TRUE.
1616           RETURN
1617 C
1618 600       IF((WEIGHR(PRSO,0)+WEIGHR(PRSI,0)+OSIZE(PRSO))
1619           &         .LE.OCAPAC(PRSI)) GO TO 700   ! not too full?
1620           IF(PRSI.NE.AVEHIC(WINNER)) GO TO 650    ! into vehicle?
1621           CALL RSPSUB(889,ODESC2(PRSI))           ! too full.
1622           RETURN
1623 C
1624 650       CALL RSPEAK(565)                        ! then cant do it.
1625           RETURN
1626 C
1627 C Now see if object (or its container) is in room
1628 C
1629 700       J=PRSO                                            ! start search.
1630 725       IF(QHERE(J,HERE)) GO TO 750             ! is it here?
1631           J=OCAN(J)
1632           IF(J.NE.0) GO TO 725                              ! more to do?
1633           GO TO 800                               ! no, sch fails.
1634 C
1635 750       IF((PRSO.EQ.WATER).OR.(PRSO.EQ.GWATE)) GO TO 800
1636           SVO=PRSO                                ! save parser.
1637           SVI=PRSI
1638           PRSA=TAKEW
1639           PRSI=0
1640           IF(.NOT.TAKE(.FALSE.)) RETURN           ! take object.
1641           PRSA=PUTW
1642           PRSO=SVO
1643           PRSI=SVI
1644           GO TO 1000
1645 C
1646 C Now see if object is on person.
1647 C
1648 800       IF(OCAN(PRSO).EQ.0) GO TO 1000                    ! inside?
1649           IF(QOPEN(OCAN(PRSO))) GO TO 900                   ! open?
1650           CALL RSPSUB(566,ODESC2(PRSO))           ! lose.
1651           RETURN
1652 C
1653 900       CALL SCRUPD(OFVAL(PRSO))                ! score object.
1654           OFVAL(PRSO)=0
1655 C old     OFLAG2(PRSO)=OFLAG2(PRSO).OR.TCHBT      ! has been touched.
1656           OFLAG2(PRSO)=OR(OFLAG2(PRSO),TCHBT)     ! has been touched.
1657           CALL NEWSTA(PRSO,0,0,0,WINNER)                    ! temporarily on winner.
1658 C
1659 1000      IF(OBJACT(X)) RETURN                              ! no, give object a shot.
1660           CALL NEWSTA(PRSO,2,0,PRSI,0)            ! contained inside.
1661           PUT=.TRUE.
1662           RETURN
1663 C
1664           END