|
|
1.1 ! root 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.