1: C VAPPLI- MAIN VERB PROCESSING ROUTINE 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 VAPPLI(RI) 10: IMPLICIT INTEGER (A-Z) 11: LOGICAL LIT,OBJACT 12: LOGICAL QEMPTY,RMDESC,CLOCKD 13: LOGICAL QOPEN,EDIBLE,DRKBLE 14: LOGICAL TAKE,PUT,DROP,WALK 15: LOGICAL QHERE,SVERBS,FINDXT,OAPPLI,F 16: #include "parser.h" 17: #include "gamestate.h" 18: #include "state.h" 19: C 20: COMMON /STAR/ MBASE,STRBIT 21: #include "rooms.h" 22: #include "rflag.h" 23: #include "rindex.h" 24: #include "xsrch.h" 25: #include "objects.h" 26: #include "oflags.h" 27: #include "oindex.h" 28: #include "advers.h" 29: #include "verbs.h" 30: C 31: C FUNCTIONS AND DATA 32: C 33: QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0 34: EDIBLE(R)=and(OFLAG1(R),FOODBT).NE.0 35: DRKBLE(R)=and(OFLAG1(R),DRNKBT).NE.0 36: DATA MXNOP/39/,MXSMP/99/ 37: C VAPPLI, PAGE 2 38: C 39: VAPPLI=.TRUE. 40: C !ASSUME WINS. 41: C 42: IF(PRSO.GT.220) GO TO 5 43: C 44: IF(PRSO.NE.0) ODO2=ODESC2(PRSO) 45: C !SET UP DESCRIPTORS. 46: 5 IF(PRSI.NE.0) ODI2=ODESC2(PRSI) 47: AV=AVEHIC(WINNER) 48: RMK=372+RND(6) 49: C !REMARK FOR HACK-HACKS. 50: C 51: IF(RI.EQ.0) GO TO 10 52: C !ZERO IS FALSE. 53: IF(RI.LE.MXNOP) RETURN 54: C !NOP? 55: IF(RI.LE.MXSMP) GO TO 100 56: C !SIMPLE VERB? 57: GO TO (18000,20000, 58: & 22000,23000,24000,25000,26000,27000,28000,29000,30000, 59: & 31000,32000,33000,34000,35000,36000, 38000,39000,40000, 60: & 41000,42000,43000,44000,45000,46000,47000,48000,49000,50000, 61: & 51000,52000,53000, 55000,56000, 58000,59000,60000, 62: & 63000,64000,65000,66000, 68000,69000,70000, 63: & 71000,72000,73000,74000, 77000,78000, 64: & 80000,81000,82000,83000,84000,85000,86000,87000,88000), 65: & (RI-MXSMP) 66: CALL BUG(7,RI) 67: C 68: C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE. 69: C 70: 10 VAPPLI=.FALSE. 71: C !LOSE. 72: RETURN 73: C 74: C SIMPLE VERBS ARE HANDLED EXTERNALLY. 75: C 76: 100 VAPPLI=SVERBS(RI) 77: RETURN 78: C VAPPLI, PAGE 3 79: C 80: C V100-- READ. OUR FIRST REAL VERB. 81: C 82: 18000 IF(LIT(HERE)) GO TO 18100 83: C !ROOM LIT? 84: CALL RSPEAK(356) 85: C !NO, CANT READ. 86: RETURN 87: C 88: 18100 IF(PRSI.EQ.0) GO TO 18200 89: C !READ THROUGH OBJ? 90: IF(and(OFLAG1(PRSI),TRANBT).NE.0) GO TO 18200 91: CALL RSPSUB(357,ODI2) 92: C !NOT TRANSPARENT. 93: RETURN 94: C 95: 18200 IF(and(OFLAG1(PRSO),READBT).NE.0) GO TO 18300 96: CALL RSPSUB(358,ODO2) 97: C !NOT READABLE. 98: RETURN 99: C 100: 18300 IF(.NOT.OBJACT(X)) CALL RSPEAK(OREAD(PRSO)) 101: RETURN 102: C 103: C V101-- MELT. UNLESS OBJECT HANDLES, JOKE. 104: C 105: 20000 IF(.NOT.OBJACT(X)) CALL RSPSUB(361,ODO2) 106: RETURN 107: C 108: C V102-- INFLATE. WORKS ONLY WITH BOATS. 109: C 110: 22000 IF(.NOT.OBJACT(X)) CALL RSPEAK(368) 111: C !OBJ HANDLE? 112: RETURN 113: C 114: C V103-- DEFLATE. 115: C 116: 23000 IF(.NOT.OBJACT(X)) CALL RSPEAK(369) 117: C !OBJ HANDLE? 118: RETURN 119: C VAPPLI, PAGE 4 120: C 121: C V104-- ALARM. IF SLEEPING, WAKE HIM UP. 122: C 123: 24000 IF(and(OFLAG2(PRSO),SLEPBT).EQ.0) GO TO 24100 124: VAPPLI=OBJACT(X) 125: C !SLEEPING, LET OBJ DO. 126: RETURN 127: C 128: 24100 CALL RSPSUB(370,ODO2) 129: C !JOKE. 130: RETURN 131: C 132: C V105-- EXORCISE. OBJECTS HANDLE. 133: C 134: 25000 F=OBJACT(X) 135: C !OBJECTS HANDLE. 136: RETURN 137: C 138: C V106-- PLUG. LET OBJECTS HANDLE. 139: C 140: 26000 IF(.NOT.OBJACT(X)) CALL RSPEAK(371) 141: RETURN 142: C 143: C V107-- KICK. IF OBJECT IGNORES, JOKE. 144: C 145: 27000 IF(.NOT.OBJACT(X)) CALL RSPSB2(378,ODO2,RMK) 146: RETURN 147: C 148: C V108-- WAVE. SAME. 149: C 150: 28000 IF(.NOT.OBJACT(X)) CALL RSPSB2(379,ODO2,RMK) 151: RETURN 152: C 153: C V109,V110-- RAISE, LOWER. SAME. 154: C 155: 29000 CONTINUE 156: 30000 IF(.NOT.OBJACT(X)) CALL RSPSB2(380,ODO2,RMK) 157: RETURN 158: C 159: C V111-- RUB. SAME. 160: C 161: 31000 IF(.NOT.OBJACT(X)) CALL RSPSB2(381,ODO2,RMK) 162: RETURN 163: C 164: C V112-- PUSH. SAME. 165: C 166: 32000 IF(.NOT.OBJACT(X)) CALL RSPSB2(382,ODO2,RMK) 167: RETURN 168: C VAPPLI, PAGE 5 169: C 170: C V113-- UNTIE. IF OBJECT IGNORES, JOKE. 171: C 172: 33000 IF(OBJACT(X)) RETURN 173: C !OBJECT HANDLE? 174: I=383 175: C !NO, NOT TIED. 176: IF(and(OFLAG2(PRSO),TIEBT).EQ.0) I=384 177: CALL RSPEAK(I) 178: RETURN 179: C 180: C V114-- TIE. NEVER REALLY WORKS. 181: C 182: 34000 IF(and(OFLAG2(PRSO),TIEBT).NE.0) GO TO 34100 183: CALL RSPEAK(385) 184: C !NOT TIEABLE. 185: RETURN 186: C 187: 34100 IF(.NOT.OBJACT(X)) CALL RSPSUB(386,ODO2) 188: C !JOKE. 189: RETURN 190: C 191: C V115-- TIE UP. NEVER REALLY WORKS. 192: C 193: 35000 IF(and(OFLAG2(PRSI),TIEBT).NE.0) GO TO 35100 194: CALL RSPSUB(387,ODO2) 195: C !NOT TIEABLE. 196: RETURN 197: C 198: 35100 I=388 199: C !ASSUME VILLAIN. 200: IF(and(OFLAG2(PRSO),VILLBT).EQ.0) I=389 201: CALL RSPSUB(I,ODO2) 202: C !JOKE. 203: RETURN 204: C 205: C V116-- TURN. OBJECT MUST HANDLE. 206: C 207: 36000 IF(and(OFLAG1(PRSO),TURNBT).NE.0) GO TO 36100 208: CALL RSPEAK(390) 209: C !NOT TURNABLE. 210: RETURN 211: C 212: 36100 IF(and(OFLAG1(PRSI),TOOLBT).NE.0) GO TO 36200 213: CALL RSPSUB(391,ODI2) 214: C !NOT A TOOL. 215: RETURN 216: C 217: 36200 VAPPLI=OBJACT(X) 218: C !LET OBJECT HANDLE. 219: RETURN 220: C 221: C V117-- BREATHE. BECOMES INFLATE WITH LUNGS. 222: C 223: 38000 PRSA=INFLAW 224: PRSI=LUNGS 225: GO TO 22000 226: C !HANDLE LIKE INFLATE. 227: C 228: C V118-- KNOCK. MOSTLY JOKE. 229: C 230: 39000 IF(OBJACT(X)) RETURN 231: C !OBJ HANDLE? 232: I=394 233: C !JOKE FOR DOOR. 234: IF(and(OFLAG1(PRSO),DOORBT).EQ.0) I=395 235: CALL RSPSUB(I,ODO2) 236: C !JOKE FOR NONDOORS TOO. 237: RETURN 238: C 239: C V119-- LOOK. 240: C 241: 40000 IF(PRSO.NE.0) GO TO 41500 242: C !SOMETHING TO LOOK AT? 243: VAPPLI=RMDESC(3) 244: C !HANDLED BY RMDESC. 245: RETURN 246: C 247: C V120-- EXAMINE. 248: C 249: 41000 IF(PRSO.NE.0) GO TO 41500 250: C !SOMETHING TO EXAMINE? 251: VAPPLI=RMDESC(0) 252: C !HANDLED BY RMDESC. 253: RETURN 254: C 255: 41500 IF(OBJACT(X)) RETURN 256: C !OBJ HANDLE? 257: I=OREAD(PRSO) 258: C !GET READING MATERIAL. 259: IF(I.NE.0) CALL RSPEAK(I) 260: C !OUTPUT IF THERE, 261: IF(I.EQ.0) CALL RSPSUB(429,ODO2) 262: C !OTHERWISE DEFAULT. 263: PRSA=FOOW 264: C !DEFUSE ROOM PROCESSORS. 265: RETURN 266: C 267: C V121-- SHAKE. IF HOLLOW OBJECT, SOME ACTION. 268: C 269: 42000 IF(OBJACT(X)) RETURN 270: C !OBJECT HANDLE? 271: IF(and(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 42100 272: CALL RSPEAK(371) 273: C !JOKE FOR VILLAINS. 274: RETURN 275: C 276: 42100 IF(QEMPTY(PRSO).OR.(and(OFLAG1(PRSO),TAKEBT).EQ.0)) 277: & GO TO 10 278: IF(QOPEN(PRSO)) GO TO 42300 279: C !OPEN? SPILL. 280: CALL RSPSUB(396,ODO2) 281: C !NO, DESCRIBE NOISE. 282: RETURN 283: C 284: 42300 CALL RSPSUB(397,ODO2) 285: C !SPILL THE WORKS. 286: DO 42500 I=1,OLNT 287: C !SPILL CONTENTS. 288: IF(OCAN(I).NE.PRSO) GO TO 42500 289: C !INSIDE? 290: OFLAG2(I)=or(OFLAG2(I),TCHBT) 291: IF(AV.EQ.0) GO TO 42400 292: C !IN VEHICLE? 293: CALL NEWSTA(I,0,0,AV,0) 294: C !YES, SPILL IN THERE. 295: GO TO 42500 296: C 297: 42400 CALL NEWSTA(I,0,HERE,0,0) 298: C !NO, SPILL ON FLOOR, 299: IF(I.EQ.WATER) CALL NEWSTA(I,133,0,0,0) 300: C !BUT WATER DISAPPEARS. 301: 42500 CONTINUE 302: RETURN 303: C 304: C V122-- MOVE. MOSTLY JOKES. 305: C 306: 43000 IF(OBJACT(X)) RETURN 307: C !OBJ HANDLE? 308: I=398 309: C !ASSUME NOT HERE. 310: IF(QHERE(PRSO,HERE)) I=399 311: CALL RSPSUB(I,ODO2) 312: C !JOKE. 313: RETURN 314: C VAPPLI, PAGE 6 315: C 316: C V123-- TURN ON. 317: C 318: 44000 F=LIT(HERE) 319: C !RECORD IF LIT. 320: IF(OBJACT(X)) GO TO 44300 321: C !OBJ HANDLE? 322: IF((and(OFLAG1(PRSO),LITEBT).NE.0).AND. 323: & (OADV(PRSO).EQ.WINNER)) GO TO 44100 324: CALL RSPEAK(400) 325: C !CANT DO IT. 326: RETURN 327: C 328: 44100 IF(and(OFLAG1(PRSO),ONBT).EQ.0) GO TO 44200 329: CALL RSPEAK(401) 330: C !ALREADY ON. 331: RETURN 332: C 333: 44200 OFLAG1(PRSO)=or(OFLAG1(PRSO),ONBT) 334: CALL RSPSUB(404,ODO2) 335: 44300 IF(.NOT.F .AND.LIT(HERE)) F=RMDESC(0) 336: C !ROOM NEWLY LIT. 337: RETURN 338: C 339: C V124-- TURN OFF. 340: C 341: 45000 IF(OBJACT(X)) GO TO 45300 342: C !OBJ HANDLE? 343: IF((and(OFLAG1(PRSO),LITEBT).NE.0).AND. 344: & (OADV(PRSO).EQ.WINNER)) GO TO 45100 345: CALL RSPEAK(402) 346: C !CANT DO IT. 347: RETURN 348: C 349: 45100 IF(and(OFLAG1(PRSO),ONBT).NE.0) GO TO 45200 350: CALL RSPEAK(403) 351: C !ALREADY OFF. 352: RETURN 353: C 354: 45200 OFLAG1(PRSO)=and(OFLAG1(PRSO), not(ONBT)) 355: CALL RSPSUB(405,ODO2) 356: 45300 IF(.NOT.LIT(HERE)) CALL RSPEAK(406) 357: C !MAY BE DARK. 358: RETURN 359: C 360: C V125-- OPEN. A FINE MESS. 361: C 362: 46000 IF(OBJACT(X)) RETURN 363: C !OBJ HANDLE? 364: IF(and(OFLAG1(PRSO),CONTBT).NE.0) GO TO 46100 365: 46050 CALL RSPSUB(407,ODO2) 366: C !NOT OPENABLE. 367: RETURN 368: C 369: 46100 IF(OCAPAC(PRSO).NE.0) GO TO 46200 370: CALL RSPSUB(408,ODO2) 371: C !NOT OPENABLE. 372: RETURN 373: C 374: 46200 IF(.NOT.QOPEN(PRSO)) GO TO 46225 375: CALL RSPEAK(412) 376: C !ALREADY OPEN. 377: RETURN 378: C 379: 46225 OFLAG2(PRSO)=or(OFLAG2(PRSO),OPENBT) 380: IF((and(OFLAG1(PRSO),TRANBT).NE.0).OR.QEMPTY(PRSO)) 381: & GO TO 46300 382: CALL PRINCO(PRSO,410) 383: C !PRINT CONTENTS. 384: RETURN 385: C 386: 46300 CALL RSPEAK(409) 387: C !DONE 388: RETURN 389: C 390: C V126-- CLOSE. 391: C 392: 47000 IF(OBJACT(X)) RETURN 393: C !OBJ HANDLE? 394: IF(and(OFLAG1(PRSO),CONTBT).EQ.0) GO TO 46050 395: IF(OCAPAC(PRSO).NE.0) GO TO 47100 396: CALL RSPSUB(411,ODO2) 397: C !NOT CLOSABLE. 398: RETURN 399: C 400: 47100 IF(QOPEN(PRSO)) GO TO 47200 401: C !OPEN? 402: CALL RSPEAK(413) 403: C !NO, JOKE. 404: RETURN 405: C 406: 47200 OFLAG2(PRSO)=and(OFLAG2(PRSO), not(OPENBT)) 407: CALL RSPEAK(414) 408: C !DONE. 409: RETURN 410: C VAPPLI, PAGE 7 411: C 412: C V127-- FIND. BIG MEGILLA. 413: C 414: 48000 IF(OBJACT(X)) RETURN 415: C !OBJ HANDLE? 416: I=415 417: C !DEFAULT CASE. 418: IF(QHERE(PRSO,HERE)) GO TO 48300 419: C !IN ROOM? 420: IF(OADV(PRSO).EQ.WINNER) GO TO 48200 421: C !ON WINNER? 422: J=OCAN(PRSO) 423: C !DOWN ONE LEVEL. 424: IF(J.EQ.0) GO TO 10 425: IF(((and(OFLAG1(J),TRANBT).EQ.0).AND. 426: & (.NOT.QOPEN(J).OR.(and(OFLAG1(J),(DOORBT+CONTBT)).EQ.0)))) 427: & GO TO 10 428: I=417 429: C !ASSUME IN ROOM. 430: IF(QHERE(J,HERE)) GO TO 48100 431: IF(OADV(J).NE.WINNER) GO TO 10 432: C !NOT HERE OR ON PERSON. 433: I=418 434: 48100 CALL RSPSUB(I,ODESC2(J)) 435: C !DESCRIBE FINDINGS. 436: RETURN 437: C 438: 48200 I=416 439: 48300 CALL RSPSUB(I,ODO2) 440: C !DESCRIBE FINDINGS. 441: RETURN 442: C 443: C V128-- WAIT. RUN CLOCK DEMON. 444: C 445: 49000 CALL RSPEAK(419) 446: C !TIME PASSES. 447: DO 49100 I=1,3 448: IF(CLOCKD(X)) RETURN 449: 49100 CONTINUE 450: RETURN 451: C 452: C V129-- SPIN. 453: C V159-- TURN TO. 454: C 455: 50000 CONTINUE 456: 88000 IF(.NOT.OBJACT(X)) CALL RSPEAK(663) 457: C !IF NOT OBJ, JOKE. 458: RETURN 459: C 460: C V130-- BOARD. WORKS WITH VEHICLES. 461: C 462: 51000 IF(and(OFLAG2(PRSO),VEHBT).NE.0) GO TO 51100 463: CALL RSPSUB(421,ODO2) 464: C !NOT VEHICLE, JOKE. 465: RETURN 466: C 467: 51100 IF(QHERE(PRSO,HERE)) GO TO 51200 468: C !HERE? 469: CALL RSPSUB(420,ODO2) 470: C !NO, JOKE. 471: RETURN 472: C 473: 51200 IF(AV.EQ.0) GO TO 51300 474: C !ALREADY GOT ONE? 475: CALL RSPSUB(422,ODO2) 476: C !YES, JOKE. 477: RETURN 478: C 479: 51300 IF(OBJACT(X)) RETURN 480: C !OBJ HANDLE? 481: CALL RSPSUB(423,ODO2) 482: C !DESCRIBE. 483: AVEHIC(WINNER)=PRSO 484: IF(WINNER.NE.PLAYER) OCAN(AOBJ(WINNER))=PRSO 485: RETURN 486: C 487: C V131-- DISEMBARK. 488: C 489: 52000 IF(AV.EQ.PRSO) GO TO 52100 490: C !FROM VEHICLE? 491: CALL RSPEAK(424) 492: C !NO, JOKE. 493: RETURN 494: C 495: 52100 IF(OBJACT(X)) RETURN 496: C !OBJ HANDLE? 497: IF(and(RFLAG(HERE),RLAND).NE.0) GO TO 52200 498: CALL RSPEAK(425) 499: C !NOT ON LAND. 500: RETURN 501: C 502: 52200 AVEHIC(WINNER)=0 503: CALL RSPEAK(426) 504: IF(WINNER.NE.PLAYER) CALL NEWSTA(AOBJ(WINNER),0,HERE,0,0) 505: RETURN 506: C 507: C V132-- TAKE. HANDLED EXTERNALLY. 508: C 509: 53000 VAPPLI=TAKE(.TRUE.) 510: RETURN 511: C 512: C V133-- INVENTORY. PROCESSED EXTERNALLY. 513: C 514: 55000 CALL INVENT(WINNER) 515: RETURN 516: C VAPPLI, PAGE 8 517: C 518: C V134-- FILL. STRANGE DOINGS WITH WATER. 519: C 520: 56000 IF(PRSI.NE.0) GO TO 56050 521: C !ANY OBJ SPECIFIED? 522: IF(and(RFLAG(HERE),(RWATER+RFILL)).NE.0) GO TO 56025 523: CALL RSPEAK(516) 524: C !NOTHING TO FILL WITH. 525: PRSWON=.FALSE. 526: C !YOU LOSE. 527: RETURN 528: C 529: 56025 PRSI=GWATE 530: C !USE GLOBAL WATER. 531: 56050 IF(OBJACT(X)) RETURN 532: C !OBJ HANDLE? 533: IF((PRSI.NE.GWATE).AND.(PRSI.NE.WATER)) 534: & CALL RSPSB2(444,ODI2,ODO2) 535: RETURN 536: C 537: C V135,V136-- EAT/DRINK 538: C 539: 58000 CONTINUE 540: 59000 IF(OBJACT(X)) RETURN 541: C !OBJ HANDLE? 542: IF(PRSO.EQ.GWATE) GO TO 59500 543: C !DRINK GLOBAL WATER? 544: IF(.NOT.EDIBLE(PRSO)) GO TO 59400 545: C !EDIBLE? 546: IF(OADV(PRSO).EQ.WINNER) GO TO 59200 547: C !YES, ON WINNER? 548: 59100 CALL RSPSUB(454,ODO2) 549: C !NOT ACCESSIBLE. 550: RETURN 551: C 552: 59200 IF(PRSA.EQ.DRINKW) GO TO 59300 553: C !DRINK FOOD? 554: CALL NEWSTA(PRSO,455,0,0,0) 555: C !NO, IT DISAPPEARS. 556: RETURN 557: C 558: 59300 CALL RSPEAK(456) 559: C !YES, JOKE. 560: RETURN 561: C 562: 59400 IF(.NOT.DRKBLE(PRSO)) GO TO 59600 563: C !DRINKABLE? 564: IF(OCAN(PRSO).EQ.0) GO TO 59100 565: C !YES, IN SOMETHING? 566: IF(OADV(OCAN(PRSO)).NE.WINNER) GO TO 59100 567: IF(QOPEN(OCAN(PRSO))) GO TO 59500 568: C !CONT OPEN? 569: CALL RSPEAK(457) 570: C !NO, JOKE. 571: RETURN 572: C 573: 59500 CALL NEWSTA(PRSO,458,0,0,0) 574: C !GONE. 575: RETURN 576: C 577: 59600 CALL RSPSUB(453,ODO2) 578: C !NOT FOOD OR DRINK. 579: RETURN 580: C 581: C V137-- BURN. COMPLICATED. 582: C 583: 60000 IF(and(OFLAG1(PRSI),(FLAMBT+LITEBT+ONBT)).NE. 584: & (FLAMBT+LITEBT+ONBT)) GO TO 60400 585: IF(OBJACT(X)) RETURN 586: C !OBJ HANDLE? 587: IF(OCAN(PRSO).NE.RECEP) GO TO 60050 588: C !BALLOON? 589: IF(OAPPLI(OACTIO(BALLO),0)) RETURN 590: C !DID IT HANDLE? 591: 60050 IF(and(OFLAG1(PRSO),BURNBT).EQ.0) GO TO 60300 592: IF(OADV(PRSO).NE.WINNER) GO TO 60100 593: C !CARRYING IT? 594: CALL RSPSUB(459,ODO2) 595: CALL JIGSUP(460) 596: RETURN 597: C 598: 60100 J=OCAN(PRSO) 599: C !GET CONTAINER. 600: IF(QHERE(PRSO,HERE).OR. ((AV.NE.0).AND.(J.EQ.AV))) 601: & GO TO 60200 602: IF(J.EQ.0) GO TO 60150 603: C !INSIDE? 604: IF(.NOT.QOPEN(J)) GO TO 60150 605: C !OPEN? 606: IF(QHERE(J,HERE).OR.((AV.NE.0).AND.(OCAN(J).EQ.AV))) 607: & GO TO 60200 608: 60150 CALL RSPEAK(461) 609: C !CANT REACH IT. 610: RETURN 611: C 612: 60200 CALL RSPSUB(462,ODO2) 613: C !BURN IT. 614: CALL NEWSTA(PRSO,0,0,0,0) 615: RETURN 616: C 617: 60300 CALL RSPSUB(463,ODO2) 618: C !CANT BURN IT. 619: RETURN 620: C 621: 60400 CALL RSPSUB(301,ODI2) 622: C !CANT BURN IT WITH THAT. 623: RETURN 624: C VAPPLI, PAGE 9 625: C 626: C V138-- MUNG. GO TO COMMON ATTACK CODE. 627: C 628: 63000 I=466 629: C !CHOOSE PHRASE. 630: IF(and(OFLAG2(PRSO),VILLBT).NE.0) GO TO 66100 631: IF(.NOT.OBJACT(X)) CALL RSPSB2(466,ODO2,RMK) 632: RETURN 633: C 634: C V139-- KILL. GO TO COMMON ATTACK CODE. 635: C 636: 64000 I=467 637: C !CHOOSE PHRASE. 638: GO TO 66100 639: C 640: C V140-- SWING. INVERT OBJECTS, FALL THRU TO ATTACK. 641: C 642: 65000 J=PRSO 643: C !INVERT. 644: PRSO=PRSI 645: PRSI=J 646: J=ODO2 647: ODO2=ODI2 648: ODI2=J 649: PRSA=ATTACW 650: C !FOR OBJACT. 651: C 652: C V141-- ATTACK. FALL THRU TO ATTACK CODE. 653: C 654: 66000 I=468 655: C 656: C COMMON MUNG/ATTACK/SWING/KILL CODE. 657: C 658: 66100 IF(PRSO.NE.0) GO TO 66200 659: C !ANYTHING? 660: CALL RSPEAK(469) 661: C !NO, JOKE. 662: RETURN 663: C 664: 66200 IF(OBJACT(X)) RETURN 665: C !OBJ HANDLE? 666: IF(and(OFLAG2(PRSO),VILLBT).NE.0) GO TO 66300 667: IF(and(OFLAG1(PRSO),VICTBT).EQ.0) 668: & CALL RSPSUB(470,ODO2) 669: RETURN 670: C 671: 66300 J=471 672: C !ASSUME NO WEAPON. 673: IF(PRSI.EQ.0) GO TO 66500 674: IF(and(OFLAG2(PRSI),WEAPBT).EQ.0) GO TO 66400 675: MELEE=1 676: C !ASSUME SWORD. 677: IF(PRSI.NE.SWORD) MELEE=2 678: C !MUST BE KNIFE. 679: I=BLOW(PLAYER,PRSO,MELEE,.TRUE.,0) 680: C !STRIKE BLOW. 681: RETURN 682: C 683: 66400 J=472 684: C !NOT A WEAPON. 685: 66500 CALL RSPSB2(I,ODO2,J) 686: C !JOKE. 687: RETURN 688: C VAPPLI, PAGE 10 689: C 690: C V142-- WALK. PROCESSED EXTERNALLY. 691: C 692: 68000 VAPPLI=WALK(X) 693: RETURN 694: C 695: C V143-- TELL. PROCESSED IN GAME. 696: C 697: 69000 CALL RSPEAK(603) 698: RETURN 699: C 700: C V144-- PUT. PROCESSED EXTERNALLY. 701: C 702: 70000 VAPPLI=PUT(.TRUE.) 703: RETURN 704: C 705: C V145,V146,V147,V148-- DROP/GIVE/POUR/THROW 706: C 707: 71000 CONTINUE 708: 72000 CONTINUE 709: 73000 CONTINUE 710: 74000 VAPPLI=DROP(.FALSE.) 711: RETURN 712: C 713: C V149-- SAVE 714: C 715: 77000 IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 77100 716: CALL RSPEAK(828) 717: C !NO SAVES IN ENDGAME. 718: RETURN 719: C 720: 77100 CALL SAVEGM 721: RETURN 722: C 723: C V150-- RESTORE 724: C 725: #ifdef PDP 726: 78000 call restor 727: #else 728: 78000 IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 78100 729: CALL RSPEAK(829) 730: C !NO RESTORES IN ENDGAME. 731: RETURN 732: C 733: 78100 CALL RSTRGM 734: #endif PDP 735: RETURN 736: C VAPPLI, PAGE 11 737: C 738: C V151-- HELLO 739: C 740: 80000 IF(PRSO.NE.0) GO TO 80100 741: C !ANY OBJ? 742: CALL RSPEAK(346+RND(4)) 743: C !NO, VANILLA HELLO. 744: RETURN 745: C 746: 80100 IF(PRSO.NE.AVIAT) GO TO 80200 747: C !HELLO AVIATOR? 748: CALL RSPEAK(350) 749: C !NOTHING HAPPENS. 750: RETURN 751: C 752: 80200 IF(PRSO.NE.SAILO) GO TO 80300 753: C !HELLO SAILOR? 754: HS=HS+1 755: C !COUNT. 756: I=351 757: C !GIVE NORMAL OR 758: IF(MOD(HS,10).EQ.0) I=352 759: C !RANDOM MESSAGE. 760: IF(MOD(HS,20).EQ.0) I=353 761: CALL RSPEAK(I) 762: C !SPEAK UP. 763: RETURN 764: C 765: 80300 IF(OBJACT(X)) RETURN 766: C !OBJ HANDLE? 767: I=354 768: C !ASSUME VILLAIN. 769: IF(and(OFLAG2(PRSO),(VILLBT+ACTRBT)).EQ.0) I=355 770: CALL RSPSUB(I,ODO2) 771: C !HELLO THERE 772: C ! 773: RETURN 774: C 775: C V152-- LOOK INTO 776: C 777: 81000 IF(OBJACT(X)) RETURN 778: C !OBJ HANDLE? 779: IF(and(OFLAG1(PRSO),DOORBT).EQ.0) GO TO 81300 780: IF(.NOT.QOPEN(PRSO)) GO TO 81200 781: C !OPEN? 782: CALL RSPSUB(628,ODO2) 783: C !OPEN DOOR- UNINTERESTING. 784: RETURN 785: C 786: 81200 CALL RSPSUB(525,ODO2) 787: C !CLOSED DOOR- CANT SEE. 788: RETURN 789: C 790: 81300 IF(and(OFLAG2(PRSO),VEHBT).NE.0) GO TO 81400 791: IF(QOPEN(PRSO).OR.(and(OFLAG1(PRSO),TRANBT).NE.0)) 792: & GO TO 81400 793: IF(and(OFLAG1(PRSO),CONTBT).NE.0) GO TO 81200 794: CALL RSPSUB(630,ODO2) 795: C !CANT LOOK INSIDE. 796: RETURN 797: C 798: 81400 IF(QEMPTY(PRSO)) GO TO 81500 799: C !VEH OR SEE IN. EMPTY? 800: CALL PRINCO(PRSO,573) 801: C !NO, LIST CONTENTS. 802: RETURN 803: C 804: 81500 CALL RSPSUB(629,ODO2) 805: C !EMPTY. 806: RETURN 807: C 808: C V153-- LOOK UNDER 809: C 810: 82000 IF(.NOT.OBJACT(X)) CALL RSPEAK(631) 811: C !OBJECT HANDLE? 812: RETURN 813: C VAPPLI, PAGE 12 814: C 815: C V154-- PUMP 816: C 817: 83000 IF((OROOM(PUMP).EQ.HERE).OR.(OADV(PUMP).EQ.WINNER)) 818: & GO TO 83100 819: CALL RSPEAK(632) 820: C !NO. 821: RETURN 822: C 823: 83100 PRSI=PUMP 824: C !BECOMES INFLATE 825: PRSA=INFLAW 826: C !X WITH PUMP. 827: GO TO 22000 828: C !DONE. 829: C 830: C V155-- WIND 831: C 832: 84000 IF(.NOT.OBJACT(X)) CALL RSPSUB(634,ODO2) 833: C !OBJ HANDLE? 834: RETURN 835: C 836: C V156-- CLIMB 837: C V157-- CLIMB UP 838: C V158-- CLIMB DOWN 839: C 840: 85000 CONTINUE 841: 86000 CONTINUE 842: 87000 I=XUP 843: C !ASSUME UP. 844: IF(PRSA.EQ.CLMBDW) I=XDOWN 845: C !UNLESS CLIMB DN. 846: F=(and(OFLAG2(PRSO),CLMBBT)).NE.0 847: IF(F.AND.FINDXT(I,HERE)) GO TO 87500 848: C !ANYTHING TO CLIMB? 849: IF(OBJACT(X)) RETURN 850: C !OBJ HANDLE? 851: I=657 852: IF(F) I=524 853: C !VARIETY OF JOKES. 854: IF(.NOT.F .AND.((PRSO.EQ.WALL).OR. 855: & ((PRSO.GE.WNORT).AND.(PRSO.LE.WNORT+3)))) 856: & I=656 857: CALL RSPEAK(I) 858: C !JOKE. 859: RETURN 860: C 861: 87500 PRSA=WALKW 862: C !WALK 863: PRSO=I 864: C !IN SPECIFIED DIR. 865: VAPPLI=WALK(X) 866: RETURN 867: C 868: END 869: C CLOCKD- CLOCK DEMON FOR INTERMOVE CLOCK EVENTS 870: C 871: C DECLARATIONS 872: C 873: LOGICAL FUNCTION CLOCKD(X) 874: IMPLICIT INTEGER (A-Z) 875: C 876: C CLOCK INTERRUPTS 877: C 878: #include "clock.h" 879: C 880: CLOCKD=.FALSE. 881: C !ASSUME NO ACTION. 882: DO 100 I=1,CLNT 883: IF(.NOT.CFLAG(I) .OR.(CTICK(I).EQ.0)) GO TO 100 884: IF(CTICK(I).LT.0) GO TO 50 885: C !PERMANENT ENTRY? 886: CTICK(I)=CTICK(I)-1 887: IF(CTICK(I).NE.0) GO TO 100 888: C !TIMER EXPIRED? 889: 50 CLOCKD=.TRUE. 890: CALL CEVAPP(CACTIO(I)) 891: C !DO ACTION. 892: 100 CONTINUE 893: RETURN 894: C 895: END