1: C OAPPLI- OBJECT SPECIAL ACTION ROUTINES
   2: C
   3: C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
   4: C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
   5: C WRITTEN BY R. M. SUPNIK
   6: C
   7: C DECLARATIONS
   8: C
   9:         LOGICAL FUNCTION OAPPLI(RI,ARG)
  10:         IMPLICIT INTEGER (A-Z)
  11:         LOGICAL SOBJS,NOBJS
  12:         LOGICAL QOPEN,QON,LIT
  13:         LOGICAL MOVETO,RMDESC,CLOCKD
  14:         LOGICAL THIEFP,CYCLOP,TROLLP,BALLOP,LIGHTP
  15:         LOGICAL QEMPTY,QHERE,F,OPNCLS
  16: #include "parser.h"
  17: #include "gamestate.h"
  18: #include "state.h"
  19: C
  20:         COMMON /BATS/ BATDRP(9)
  21: C
  22: C PUZZLE ROOM
  23: C
  24:         COMMON /PUZZLE/ CPDR(16),CPWL(8),CPVEC(64)
  25: #include "rooms.h"
  26: #include "rflag.h"
  27: #include "rindex.h"
  28: #include "objects.h"
  29: #include "oflags.h"
  30: #include "oindex.h"
  31: #include "clock.h"
  32: 
  33: #include "advers.h"
  34: #include "verbs.h"
  35: #include "flags.h"
  36: C
  37: C FUNCTIONS AND DATA
  38: C
  39:         QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
  40:         QON(R)=and(OFLAG1(R),ONBT).NE.0
  41:         DATA MXSMP/99/
  42: C OAPPLI, PAGE 2
  43: C
  44:         IF(RI.EQ.0) GO TO 10
  45: C						!ZERO IS FALSE APP.
  46:         IF(RI.LE.MXSMP) GO TO 100
  47: C						!SIMPLE OBJECT?
  48:         IF(PRSO.GT.220) GO TO 5
  49:         IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
  50: 5       IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  51:         AV=AVEHIC(WINNER)
  52:         FLOBTS=FLAMBT+LITEBT+ONBT
  53:         OAPPLI=.TRUE.
  54: C
  55:         GO TO (2000,5000,10000,11000,12000,15000,18000,
  56: &        19000,20000,22000,25000,26000,32000,35000,39000,40000,
  57: &        45000,47000,48000,49000,50000,51000,52000,54000,55000,
  58: &        56000,57000,58000,59000,60000,61000,62000),
  59: &               (RI-MXSMP)
  60:         CALL BUG(6,RI)
  61: C
  62: C RETURN HERE TO DECLARE FALSE RESULT
  63: C
  64: 10      OAPPLI=.FALSE.
  65:         RETURN
  66: C
  67: C SIMPLE OBJECTS, PROCESSED EXTERNALLY.
  68: C
  69: 100     IF(RI.LT.32) OAPPLI=SOBJS(RI,ARG)
  70:         IF(RI.GE.32) OAPPLI=NOBJS(RI,ARG)
  71:         RETURN
  72: C OAPPLI, PAGE 3
  73: C
  74: C O100--	MACHINE FUNCTION
  75: C
  76: 2000    IF(HERE.NE.MMACH) GO TO 10
  77: C						!NOT HERE? F
  78:         OAPPLI=OPNCLS(MACHI,123,124)
  79: C						!HANDLE OPN/CLS.
  80:         RETURN
  81: C
  82: C O101--	WATER FUNCTION
  83: C
  84: 5000    IF(PRSA.NE.FILLW) GO TO 5050
  85: C						!FILL X WITH Y IS
  86:         PRSA=PUTW
  87: C						!MADE INTO
  88:         I=PRSI
  89:         PRSI=PRSO
  90:         PRSO=I
  91: C						!PUT Y IN X.
  92:         I=ODI2
  93:         ODI2=ODO2
  94:         ODO2=I
  95: 5050    IF((PRSO.EQ.WATER).OR.(PRSO.EQ.GWATE)) GO TO 5100
  96:         CALL RSPEAK(561)
  97: C						!WATER IS IND OBJ,
  98:         RETURN
  99: C						!PUNT.
 100: C
 101: 5100    IF(PRSA.NE.TAKEW) GO TO 5400
 102: C						!TAKE WATER?
 103:         IF((OADV(BOTTL).EQ.WINNER).AND.(OCAN(PRSO).NE.BOTTL))
 104: &               GO TO 5500
 105:         IF(OCAN(PRSO).EQ.0) GO TO 5200
 106: C						!INSIDE ANYTHING?
 107:         IF(QOPEN(OCAN(PRSO))) GO TO 5200
 108: C						!YES, OPEN?
 109:         CALL RSPEAK(525,ODESC2(OCAN(PRSO)))
 110: C						!INSIDE, CLOSED, PUNT.
 111:         RETURN
 112: C
 113: 5200    CALL RSPEAK(615)
 114: C						!NOT INSIDE OR OPEN,
 115:         RETURN
 116: C						!SLIPS THRU FINGERS.
 117: C
 118: 5400    IF(PRSA.NE.PUTW) GO TO 5700
 119: C						!PUT WATER IN X?
 120:         IF((AV.NE.0).AND.(PRSI.EQ.AV)) GO TO 5800
 121: C						!IN VEH?
 122:         IF(PRSI.EQ.BOTTL) GO TO 5500
 123: C						!IN BOTTLE?
 124:         CALL RSPSUB(297,ODI2)
 125: C						!WONT GO ELSEWHERE.
 126:         CALL NEWSTA(PRSO,0,0,0,0)
 127: C						!VANISH WATER.
 128:         RETURN
 129: C
 130: 5500    IF(QOPEN(BOTTL)) GO TO 5550
 131: C						!BOTTLE OPEN?
 132:         CALL RSPEAK(612)
 133: C						!NO, LOSE.
 134:         RETURN
 135: C
 136: 5550    IF(QEMPTY(BOTTL)) GO TO 5600
 137: C						!OPEN, EMPTY?
 138:         CALL RSPEAK(613)
 139: C						!NO, ALREADY FULL.
 140:         RETURN
 141: C
 142: 5600    CALL NEWSTA(WATER,614,0,BOTTL,0)
 143: C						!TAKE WATER TO BOTTLE.
 144:         RETURN
 145: C
 146: 5700    IF((PRSA.NE.DROPW).AND.(PRSA.NE.POURW).AND.
 147: &               (PRSA.NE.GIVEW)) GO TO 5900
 148:         IF(AV.NE.0) GO TO 5800
 149: C						!INTO VEHICLE?
 150:         CALL NEWSTA(PRSO,133,0,0,0)
 151: C						!NO, VANISHES.
 152:         RETURN
 153: C
 154: 5800    CALL NEWSTA(WATER,0,0,AV,0)
 155: C						!WATER INTO VEHICLE.
 156:         CALL RSPSUB(296,ODESC2(AV))
 157: C						!DESCRIBE.
 158:         RETURN
 159: C
 160: 5900    IF(PRSA.NE.THROWW) GO TO 10
 161: C						!LAST CHANCE, THROW?
 162:         CALL NEWSTA(PRSO,132,0,0,0)
 163: C						!VANISHES.
 164:         RETURN
 165: C OAPPLI, PAGE 4
 166: C
 167: C O102--	LEAF PILE
 168: C
 169: 10000   IF(PRSA.NE.BURNW) GO TO 10500
 170: C						!BURN?
 171:         IF(OROOM(PRSO).EQ.0) GO TO 10100
 172: C						!WAS HE CARRYING?
 173:         CALL NEWSTA(PRSO,158,0,0,0)
 174: C						!NO, BURN IT.
 175:         RETURN
 176: C
 177: 10100   CALL NEWSTA(PRSO,0,HERE,0,0)
 178: C						!DROP LEAVES.
 179:         CALL JIGSUP(159)
 180: C						!BURN HIM.
 181:         RETURN
 182: C
 183: 10500   IF(PRSA.NE.MOVEW) GO TO 10600
 184: C						!MOVE?
 185:         CALL RSPEAK(2)
 186: C						!DONE.
 187:         RETURN
 188: C
 189: 10600   IF((PRSA.NE.LOOKUW).OR.(RVCLR.NE.0)) GO TO 10
 190:         CALL RSPEAK(344)
 191: C						!LOOK UNDER?
 192:         RETURN
 193: C
 194: C O103--	TROLL, DONE EXTERNALLY.
 195: C
 196: 11000   OAPPLI=TROLLP(ARG)
 197: C						!TROLL PROCESSOR.
 198:         RETURN
 199: C
 200: C O104--	RUSTY KNIFE.
 201: C
 202: 12000   IF(PRSA.NE.TAKEW) GO TO 12100
 203: C						!TAKE?
 204:         IF(OADV(SWORD).EQ.WINNER) CALL RSPEAK(160)
 205: C						!PULSE SWORD.
 206:         GO TO 10
 207: C
 208: 12100   IF((((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW)).OR.
 209: &               (PRSI.NE.RKNIF)).AND.
 210: &         (((PRSA.NE.SWINGW).AND.(PRSA.NE.THROWW)).OR.
 211: &               (PRSO.NE.RKNIF))) GO TO 10
 212:         CALL NEWSTA(RKNIF,0,0,0,0)
 213: C						!KILL KNIFE.
 214:         CALL JIGSUP(161)
 215: C						!KILL HIM.
 216:         RETURN
 217: C OAPPLI, PAGE 5
 218: C
 219: C O105--	GLACIER
 220: C
 221: 15000   IF(PRSA.NE.THROWW) GO TO 15500
 222: C						!THROW?
 223:         IF(PRSO.NE.TORCH) GO TO 15400
 224: C						!TORCH?
 225:         CALL NEWSTA(ICE,169,0,0,0)
 226: C						!MELT ICE.
 227:         ODESC1(TORCH)=174
 228: C						!MUNG TORCH.
 229:         ODESC2(TORCH)=173
 230:         OFLAG1(TORCH)=and(OFLAG1(TORCH), not(FLOBTS))
 231:         CALL NEWSTA(TORCH,0,STREA,0,0)
 232: C						!MOVE TORCH.
 233:         GLACRF=.TRUE.
 234: C						!GLACIER GONE.
 235:         IF(.NOT.LIT(HERE)) CALL RSPEAK(170)
 236: C						!IN DARK?
 237:         RETURN
 238: C
 239: 15400   CALL RSPEAK(171)
 240: C						!JOKE IF NOT TORCH.
 241:         RETURN
 242: C
 243: 15500   IF((PRSA.NE.MELTW).OR.(PRSO.NE.ICE)) GO TO 10
 244:         IF(and(OFLAG1(PRSI),FLOBTS).EQ.FLOBTS) GO TO 15600
 245:         CALL RSPSUB(298,ODI2)
 246: C						!CANT MELT WITH THAT.
 247:         RETURN
 248: C
 249: 15600   GLACMF=.TRUE.
 250: C						!PARTIAL MELT.
 251:         IF(PRSI.NE.TORCH) GO TO 15700
 252: C						!MELT WITH TORCH?
 253:         ODESC1(TORCH)=174
 254: C						!MUNG TORCH.
 255:         ODESC2(TORCH)=173
 256:         OFLAG1(TORCH)=and(OFLAG1(TORCH), not(FLOBTS))
 257: 15700   CALL JIGSUP(172)
 258: C						!DROWN.
 259:         RETURN
 260: C
 261: C O106--	BLACK BOOK
 262: C
 263: 18000   IF(PRSA.NE.OPENW) GO TO 18100
 264: C						!OPEN?
 265:         CALL RSPEAK(180)
 266: C						!JOKE.
 267:         RETURN
 268: C
 269: 18100   IF(PRSA.NE.CLOSEW) GO TO 18200
 270: C						!CLOSE?
 271:         CALL RSPEAK(181)
 272:         RETURN
 273: C
 274: 18200   IF(PRSA.NE.BURNW) GO TO 10
 275: C						!BURN?
 276:         CALL NEWSTA(PRSO,0,0,0,0)
 277: C						!FATAL JOKE.
 278:         CALL JIGSUP(182)
 279:         RETURN
 280: C OAPPLI, PAGE 6
 281: C
 282: C O107--	CANDLES, PROCESSED EXTERNALLY
 283: C
 284: 19000   OAPPLI=LIGHTP(CANDL)
 285:         RETURN
 286: C
 287: C O108--	MATCHES, PROCESSED EXTERNALLY
 288: C
 289: 20000   OAPPLI=LIGHTP(MATCH)
 290:         RETURN
 291: C
 292: C O109--	CYCLOPS, PROCESSED EXTERNALLY.
 293: C
 294: 22000   OAPPLI=CYCLOP(ARG)
 295: C						!CYCLOPS
 296:         RETURN
 297: C
 298: C O110--	THIEF, PROCESSED EXTERNALLY
 299: C
 300: 25000   OAPPLI=THIEFP(ARG)
 301:         RETURN
 302: C
 303: C O111--	WINDOW
 304: C
 305: 26000   OAPPLI=OPNCLS(WINDO,208,209)
 306: C						!OPEN/CLS WINDOW.
 307:         RETURN
 308: C
 309: C O112--	PILE OF BODIES
 310: C
 311: 32000   IF(PRSA.NE.TAKEW) GO TO 32500
 312: C						!TAKE?
 313:         CALL RSPEAK(228)
 314: C						!CANT.
 315:         RETURN
 316: C
 317: 32500   IF((PRSA.NE.BURNW).AND.(PRSA.NE.MUNGW)) GO TO 10
 318:         IF(ONPOLF) RETURN
 319: C						!BURN OR MUNG?
 320:         ONPOLF=.TRUE.
 321: C						!SET HEAD ON POLE.
 322:         CALL NEWSTA(HPOLE,0,LLD2,0,0)
 323:         CALL JIGSUP(229)
 324: C						!BEHEADED.
 325:         RETURN
 326: C
 327: C O113--	VAMPIRE BAT
 328: C
 329: 35000   CALL RSPEAK(50)
 330: C						!TIME TO FLY, JACK.
 331:         F=MOVETO(BATDRP(RND(9)+1),WINNER)
 332: C						!SELECT RANDOM DEST.
 333:         F=RMDESC(0)
 334:         RETURN
 335: C OAPPLI, PAGE 7
 336: C
 337: C O114--	STICK
 338: C
 339: 39000   IF(PRSA.NE.WAVEW) GO TO 10
 340: C						!WAVE?
 341:         IF(HERE.EQ.MRAIN) GO TO 39500
 342: C						!ON RAINBOW?
 343:         IF((HERE.EQ.POG).OR.(HERE.EQ.FALLS)) GO TO 39200
 344:         CALL RSPEAK(244)
 345: C						!NOTHING HAPPENS.
 346:         RETURN
 347: C
 348: 39200   OFLAG1(POT)=or(OFLAG1(POT),VISIBT)
 349:         RAINBF=.NOT. RAINBF
 350: C						!COMPLEMENT RAINBOW.
 351:         I=245
 352: C						!ASSUME OFF.
 353:         IF(RAINBF) I=246
 354: C						!IF ON, SOLID.
 355:         CALL RSPEAK(I)
 356: C						!DESCRIBE.
 357:         RETURN
 358: C
 359: 39500   RAINBF=.FALSE.
 360: C						!ON RAINBOW,
 361:         CALL JIGSUP(247)
 362: C						!TAKE A FALL.
 363:         RETURN
 364: C
 365: C O115--	BALLOON, HANDLED EXTERNALLY
 366: C
 367: 40000   OAPPLI=BALLOP(ARG)
 368:         RETURN
 369: C
 370: C O116--	HEADS
 371: C
 372: 45000   IF(PRSA.NE.HELLOW) GO TO 45100
 373: C						!HELLO HEADS?
 374:         CALL RSPEAK(633)
 375: C						!TRULY BIZARRE.
 376:         RETURN
 377: C
 378: 45100   IF(PRSA.EQ.READW) GO TO 10
 379: C						!READ IS OK.
 380:         CALL NEWSTA(LCASE,260,LROOM,0,0)
 381: C						!MAKE LARGE CASE.
 382:         I=ROBADV(WINNER,0,LCASE,0)+ROBRM(HERE,100,0,LCASE,0)
 383:         CALL JIGSUP(261)
 384: C						!KILL HIM.
 385:         RETURN
 386: C OAPPLI, PAGE 8
 387: C
 388: C O117--	SPHERE
 389: C
 390: 47000   IF(CAGESF.OR.(PRSA.NE.TAKEW)) GO TO 10
 391: C						!TAKE?
 392:         IF(WINNER.NE.PLAYER) GO TO 47500
 393: C						!ROBOT TAKE?
 394:         CALL RSPEAK(263)
 395: C						!NO, DROP CAGE.
 396:         IF(OROOM(ROBOT).NE.HERE) GO TO 47200
 397: C						!ROBOT HERE?
 398:         F=MOVETO(CAGED,WINNER)
 399: C						!YES, MOVE INTO CAGE.
 400:         CALL NEWSTA(ROBOT,0,CAGED,0,0)
 401: C						!MOVE ROBOT.
 402:         AROOM(AROBOT)=CAGED
 403:         OFLAG1(ROBOT)=or(OFLAG1(ROBOT),NDSCBT)
 404:         CTICK(CEVSPH)=10
 405: C						!GET OUT IN 10 OR ELSE.
 406:         RETURN
 407: C
 408: 47200   CALL NEWSTA(SPHER,0,0,0,0)
 409: C						!YOURE DEAD.
 410:         RFLAG(CAGER)=or(RFLAG(CAGER),RMUNG)
 411:         RRAND(CAGER)=147
 412:         CALL JIGSUP(148)
 413: C						!MUNG PLAYER.
 414:         RETURN
 415: C
 416: 47500   CALL NEWSTA(SPHER,0,0,0,0)
 417: C						!ROBOT TRIED,
 418:         CALL NEWSTA(ROBOT,264,0,0,0)
 419: C						!KILL HIM.
 420:         CALL NEWSTA(CAGE,0,HERE,0,0)
 421: C						!INSERT MANGLED CAGE.
 422:         RETURN
 423: C
 424: C O118--	GEOMETRICAL BUTTONS
 425: C
 426: 48000   IF(PRSA.NE.PUSHW) GO TO 10
 427: C						!PUSH?
 428:         I=PRSO-SQBUT+1
 429: C						!GET BUTTON INDEX.
 430:         IF((I.LE.0).OR.(I.GE.4)) GO TO 10
 431: C						!A BUTTON?
 432:         IF(WINNER.NE.PLAYER) GO TO (48100,48200,48300),I
 433:         CALL JIGSUP(265)
 434: C						!YOU PUSHED, YOU DIE.
 435:         RETURN
 436: C
 437: 48100   I=267
 438:         IF(CAROZF) I=266
 439: C						!SPEED UP?
 440:         CAROZF=.TRUE.
 441:         CALL RSPEAK(I)
 442:         RETURN
 443: C
 444: 48200   I=266
 445: C						!ASSUME NO CHANGE.
 446:         IF(CAROZF) I=268
 447:         CAROZF=.FALSE.
 448:         CALL RSPEAK(I)
 449:         RETURN
 450: C
 451: 48300   CAROFF=.NOT.CAROFF
 452: C						!FLIP CAROUSEL.
 453:         IF(.NOT.QHERE(IRBOX,CAROU)) RETURN
 454: C						!IRON BOX IN CAROUSEL?
 455:         CALL RSPEAK(269)
 456: C						!YES, THUMP.
 457:         OFLAG1(IRBOX)=xor(OFLAG1(IRBOX),VISIBT)
 458:         IF(CAROFF) RFLAG(CAROU)=and(RFLAG(CAROU), not(RSEEN))
 459:         RETURN
 460: C
 461: C O119--	FLASK FUNCTION
 462: C
 463: 49000   IF(PRSA.EQ.OPENW) GO TO 49100
 464: C						!OPEN?
 465:         IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
 466:         CALL NEWSTA(FLASK,270,0,0,0)
 467: C						!KILL FLASK.
 468: 49100   RFLAG(HERE)=or(RFLAG(HERE),RMUNG)
 469:         RRAND(HERE)=271
 470:         CALL JIGSUP(272)
 471: C						!POISONED.
 472:         RETURN
 473: C
 474: C O120--	BUCKET FUNCTION
 475: C
 476: 50000   IF(ARG.NE.2) GO TO 10
 477: C						!READOUT?
 478:         IF((OCAN(WATER).NE.BUCKE).OR.BUCKTF) GO TO 50500
 479:         BUCKTF=.TRUE.
 480: C						!BUCKET AT TOP.
 481:         CTICK(CEVBUC)=100
 482: C						!START COUNTDOWN.
 483:         CALL NEWSTA(BUCKE,290,TWELL,0,0)
 484: C						!REPOSITION BUCKET.
 485:         GO TO 50900
 486: C						!FINISH UP.
 487: C
 488: 50500   IF((OCAN(WATER).EQ.BUCKE).OR..NOT.BUCKTF) GO TO 10
 489:         BUCKTF=.FALSE.
 490:         CALL NEWSTA(BUCKE,291,BWELL,0,0)
 491: C						!BUCKET AT BOTTOM.
 492: 50900   IF(AV.NE.BUCKE) RETURN
 493: C						!IN BUCKET?
 494:         F=MOVETO(OROOM(BUCKE),WINNER)
 495: C						!MOVE ADVENTURER.
 496:         F=RMDESC(0)
 497: C						!DESCRIBE ROOM.
 498:         RETURN
 499: C OAPPLI, PAGE 9
 500: C
 501: C O121--	EATME CAKE
 502: C
 503: 51000   IF((PRSA.NE.EATW).OR.(PRSO.NE.ECAKE).OR.
 504: &               (HERE.NE.ALICE)) GO TO 10
 505:         CALL NEWSTA(ECAKE,273,0,0,0)
 506: C						!VANISH CAKE.
 507:         OFLAG1(ROBOT)=and(OFLAG1(ROBOT), not(VISIBT))
 508:         OAPPLI=MOVETO(ALISM,WINNER)
 509: C						!MOVE TO ALICE SMALL.
 510:         IZ=64
 511:         IR=ALISM
 512:         IO=ALICE
 513:         GO TO 52405
 514: C
 515: C O122--	ICINGS
 516: C
 517: 52000   IF(PRSA.NE.READW) GO TO 52200
 518: C						!READ?
 519:         I=274
 520: C						!CANT READ.
 521:         IF(PRSI.NE.0) I=275
 522: C						!THROUGH SOMETHING?
 523:         IF(PRSI.EQ.BOTTL) I=276
 524: C						!THROUGH BOTTLE?
 525:         IF(PRSI.EQ.FLASK) I=277+(PRSO-ORICE)
 526: C						!THROUGH FLASK?
 527:         CALL RSPEAK(I)
 528: C						!READ FLASK.
 529:         RETURN
 530: C
 531: 52200   IF((PRSA.NE.THROWW).OR.(PRSO.NE.RDICE).OR.(PRSI.NE.POOL))
 532: &               GO TO 52300
 533:         CALL NEWSTA(POOL,280,0,0,0)
 534: C						!VANISH POOL.
 535:         OFLAG1(SAFFR)=or(OFLAG1(SAFFR),VISIBT)
 536:         RETURN
 537: C
 538: 52300   IF((HERE.NE.ALICE).AND.(HERE.NE.ALISM).AND.(HERE.NE.ALITR))
 539: &               GO TO 10
 540:         IF(((PRSA.NE.EATW).AND.(PRSA.NE.THROWW)).OR.
 541: &               (PRSO.NE.ORICE)) GO TO 52400
 542:         CALL NEWSTA(ORICE,0,0,0,0)
 543: C						!VANISH ORANGE ICE.
 544:         RFLAG(HERE)=or(RFLAG(HERE),RMUNG)
 545:         RRAND(HERE)=281
 546:         CALL JIGSUP(282)
 547: C						!VANISH ADVENTURER.
 548:         RETURN
 549: C
 550: 52400   IF((PRSA.NE.EATW).OR.(PRSO.NE.BLICE))
 551: &               GO TO 10
 552:         CALL NEWSTA(BLICE,283,0,0,0)
 553: C						!VANISH BLUE ICE.
 554:         IF(HERE.NE.ALISM) GO TO 52500
 555: C						!IN REDUCED ROOM?
 556:         OFLAG1(ROBOT)=or(OFLAG1(ROBOT),VISIBT)
 557:         IO=HERE
 558:         OAPPLI=MOVETO(ALICE,WINNER)
 559:         IZ=1/64
 560:         IR=ALICE
 561: C
 562: C  Do a size change, common loop used also by code at 51000
 563: C
 564: 52405   DO 52450 I=1,OLNT
 565: C						!ENLARGE WORLD.
 566:           IF((OROOM(I).NE.IO).OR.(OSIZE(I).EQ.10000))
 567: &               GO TO 52450
 568:           OROOM(I)=IR
 569:           OSIZE(I)=OSIZE(I)*IZ
 570: 52450   CONTINUE
 571:         RETURN
 572: C
 573: 52500   CALL JIGSUP(284)
 574: C						!ENLARGED IN WRONG ROOM.
 575:         RETURN
 576: C
 577: C O123--	BRICK
 578: C
 579: 54000   IF(PRSA.NE.BURNW) GO TO 10
 580: C						!BURN?
 581:         CALL JIGSUP(150)
 582: C						!BOOM
 583: C						!
 584:         RETURN
 585: C
 586: C O124--	MYSELF
 587: C
 588: 55000   IF(PRSA.NE.GIVEW) GO TO 55100
 589: C						!GIVE?
 590:         CALL NEWSTA(PRSO,2,0,0,PLAYER)
 591: C						!DONE.
 592:         RETURN
 593: C
 594: 55100   IF(PRSA.NE.TAKEW) GO TO 55200
 595: C						!TAKE?
 596:         CALL RSPEAK(286)
 597: C						!JOKE.
 598:         RETURN
 599: C
 600: 55200   IF((PRSA.NE.KILLW).AND.(PRSA.NE.MUNGW)) GO TO 10
 601:         CALL JIGSUP(287)
 602: C						!KILL, NO JOKE.
 603:         RETURN
 604: C OAPPLI, PAGE 10
 605: C
 606: C O125--	PANELS INSIDE MIRROR
 607: C
 608: 56000   IF(PRSA.NE.PUSHW) GO TO 10
 609: C						!PUSH?
 610:         IF(POLEUF.NE.0) GO TO 56100
 611: C						!SHORT POLE UP?
 612:         I=731
 613: C						!NO, WONT BUDGE.
 614:         IF(MOD(MDIR,180).EQ.0) I=732
 615: C						!DIFF MSG IF N-S.
 616:         CALL RSPEAK(I)
 617: C						!TELL WONT MOVE.
 618:         RETURN
 619: C
 620: 56100   IF(MLOC.NE.MRG) GO TO 56200
 621: C						!IN GDN ROOM?
 622:         CALL RSPEAK(733)
 623: C						!YOU LOSE.
 624:         CALL JIGSUP(685)
 625:         RETURN
 626: C
 627: 56200   I=831
 628: C						!ROTATE L OR R.
 629:         IF((PRSO.EQ.RDWAL).OR.(PRSO.EQ.YLWAL)) I=830
 630:         CALL RSPEAK(I)
 631: C						!TELL DIRECTION.
 632:         MDIR=MOD(MDIR+45+(270*(I-830)),360)
 633: C						!CALCULATE NEW DIR.
 634:         CALL RSPSUB(734,695+(MDIR/45))
 635: C						!TELL NEW DIR.
 636:         IF(WDOPNF) CALL RSPEAK(730)
 637: C						!IF PANEL OPEN, CLOSE.
 638:         WDOPNF=.FALSE.
 639:         RETURN
 640: C						!DONE.
 641: C
 642: C O126--	ENDS INSIDE MIRROR
 643: C
 644: 57000   IF(PRSA.NE.PUSHW) GO TO 10
 645: C						!PUSH?
 646:         IF(MOD(MDIR,180).EQ.0) GO TO 57100
 647: C						!MIRROR N-S?
 648:         CALL RSPEAK(735)
 649: C						!NO, WONT BUDGE.
 650:         RETURN
 651: C
 652: 57100   IF(PRSO.NE.PINDR) GO TO 57300
 653: C						!PUSH PINE WALL?
 654:         IF(((MLOC.EQ.MRC).AND.(MDIR.EQ.180)).OR.
 655: &         ((MLOC.EQ.MRD).AND.(MDIR.EQ.0)).OR.
 656: &          (MLOC.EQ.MRG)) GO TO 57200
 657:         CALL RSPEAK(736)
 658: C						!NO, OPENS.
 659:         WDOPNF=.TRUE.
 660: C						!INDICATE OPEN.
 661:         CFLAG(CEVPIN)=.TRUE.
 662: C						!TIME OPENING.
 663:         CTICK(CEVPIN)=5
 664:         RETURN
 665: C
 666: 57200   CALL RSPEAK(737)
 667: C						!GDN SEES YOU, DIE.
 668:         CALL JIGSUP(685)
 669:         RETURN
 670: C
 671: 57300   NLOC=MLOC-1
 672: C						!NEW LOC IF SOUTH.
 673:         IF(MDIR.EQ.0) NLOC=MLOC+1
 674: C						!NEW LOC IF NORTH.
 675:         IF((NLOC.GE.MRA).AND.(NLOC.LE.MRD)) GO TO 57400
 676:         CALL RSPEAK(738)
 677: C						!HAVE REACHED END.
 678:         RETURN
 679: C
 680: 57400   I=699
 681: C						!ASSUME SOUTH.
 682:         IF(MDIR.EQ.0) I=695
 683: C						!NORTH.
 684:         J=739
 685: C						!ASSUME SMOOTH.
 686:         IF(POLEUF.NE.0) J=740
 687: C						!POLE UP, WOBBLES.
 688:         CALL RSPSUB(J,I)
 689: C						!DESCRIBE.
 690:         MLOC=NLOC
 691:         IF(MLOC.NE.MRG) RETURN
 692: C						!NOW IN GDN ROOM?
 693: C
 694:         IF(POLEUF.NE.0) GO TO 57500
 695: C						!POLE UP, GDN SEES.
 696:         IF(MROPNF.OR.WDOPNF) GO TO 57600
 697: C						!DOOR OPEN, GDN SEES.
 698:         IF(MR1F.AND.MR2F) RETURN
 699: C						!MIRRORS INTACT, OK.
 700:         CALL RSPEAK(742)
 701: C						!MIRRORS BROKEN, DIE.
 702:         CALL JIGSUP(743)
 703:         RETURN
 704: C
 705: 57500   CALL RSPEAK(741)
 706: C						!POLE UP, DIE.
 707:         CALL JIGSUP(743)
 708:         RETURN
 709: C
 710: 57600   CALL RSPEAK(744)
 711: C						!DOOR OPEN, DIE.
 712:         CALL JIGSUP(743)
 713:         RETURN
 714: C OAPPLI, PAGE 11
 715: C
 716: C O127--	GLOBAL GUARDIANS
 717: C
 718: 58000   IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
 719: &         (PRSA.NE.MUNGW)) GO TO 58100
 720:         CALL JIGSUP(745)
 721: C						!LOSE.
 722:         RETURN
 723: C
 724: 58100   IF(PRSA.NE.HELLOW) GO TO 10
 725: C						!HELLO?
 726:         CALL RSPEAK(746)
 727: C						!NO REPLY.
 728:         RETURN
 729: C
 730: C O128--	GLOBAL MASTER
 731: C
 732: 59000   IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
 733: &         (PRSA.NE.MUNGW)) GO TO 59100
 734:         CALL JIGSUP(747)
 735: C						!BAD IDEA.
 736:         RETURN
 737: C
 738: 59100   IF(PRSA.NE.TAKEW) GO TO 10
 739: C						!TAKE?
 740:         CALL RSPEAK(748)
 741: C						!JOKE.
 742:         RETURN
 743: C
 744: C O129--	NUMERAL FIVE (FOR JOKE)
 745: C
 746: 60000   IF(PRSA.NE.TAKEW) GO TO 10
 747: C						!TAKE FIVE?
 748:         CALL RSPEAK(419)
 749: C						!TIME PASSES.
 750:         DO 60100 I=1,3
 751: C						!WAIT A WHILE.
 752:           IF(CLOCKD(X)) RETURN
 753: 60100   CONTINUE
 754:         RETURN
 755: C
 756: C O130--	CRYPT FUNCTION
 757: C
 758: 61000   IF(.NOT.ENDGMF) GO TO 45000
 759: C						!IF NOT EG, DIE.
 760:         IF(PRSA.NE.OPENW) GO TO 61100
 761: C						!OPEN?
 762:         I=793
 763:         IF(QOPEN(TOMB)) I=794
 764:         CALL RSPEAK(I)
 765:         OFLAG2(TOMB)=or(OFLAG2(TOMB),OPENBT)
 766:         RETURN
 767: C
 768: 61100   IF(PRSA.NE.CLOSEW) GO TO 45000
 769: C						!CLOSE?
 770:         I=795
 771:         IF(QOPEN(TOMB)) I=796
 772:         CALL RSPEAK(I)
 773:         OFLAG2(TOMB)=and(OFLAG2(TOMB),not(OPENBT))
 774:         IF(HERE.EQ.CRYPT) CTICK(CEVSTE)=3
 775: C						!IF IN CRYPT, START EG.
 776:         RETURN
 777: C OAPPLI, PAGE 12
 778: C
 779: C O131--	GLOBAL LADDER
 780: C
 781: 62000   IF((CPVEC(CPHERE+1).EQ.-2).OR.(CPVEC(CPHERE-1).EQ.-3))
 782: &               GO TO 62100
 783:         CALL RSPEAK(865)
 784: C						!NO, LOSE.
 785:         RETURN
 786: C
 787: 62100   IF((PRSA.EQ.CLMBW).OR.(PRSA.EQ.CLMBUW)) GO TO 62200
 788:         CALL RSPEAK(866)
 789: C						!CLIMB IT?
 790:         RETURN
 791: C
 792: 62200   IF((CPHERE.EQ.10).AND.(CPVEC(CPHERE+1).EQ.-2))
 793: &               GO TO 62300
 794:         CALL RSPEAK(867)
 795: C						!NO, HIT YOUR HEAD.
 796:         RETURN
 797: C
 798: 62300   F=MOVETO(CPANT,WINNER)
 799: C						!TO ANTEROOM.
 800:         F=RMDESC(3)
 801: C						!DESCRIBE.
 802:         RETURN
 803: C
 804:         END
Last modified: 1988-10-21
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2290
Valid CSS Valid XHTML 1.0 Strict