|
|
1.1 ! root 1: C SVERBS- SIMPLE VERBS PROCESSOR ! 2: C ALL VERBS IN THIS ROUTINE MUST BE INDEPENDANT ! 3: C OF OBJECT ACTIONS ! 4: C ! 5: C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142 ! 6: C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED ! 7: C WRITTEN BY R. M. SUPNIK ! 8: C ! 9: C DECLARATIONS ! 10: C ! 11: LOGICAL FUNCTION SVERBS(RI) ! 12: IMPLICIT INTEGER (A-Z) ! 13: LOGICAL MOVETO,YESNO ! 14: LOGICAL RMDESC ! 15: LOGICAL QOPEN ! 16: LOGICAL FINDXT,QHERE,F ! 17: INTEGER JOKES(25) ! 18: CHARACTER ANSSTR(78) ! 19: CHARACTER PP1(6),PP2(6),CH(6) ! 20: INTEGER ANSWER(28) ! 21: #include "parser.h" ! 22: #include "gamestate.h" ! 23: #include "state.h" ! 24: #include "screen.h" ! 25: C ! 26: C MISCELLANEOUS VARIABLES ! 27: C ! 28: CHARACTER VEDIT ! 29: COMMON /VERS/ VMAJ,VMIN,VEDIT ! 30: #include "io.h" ! 31: #include "rooms.h" ! 32: #include "rflag.h" ! 33: #include "rindex.h" ! 34: #include "exits.h" ! 35: #include "curxt.h" ! 36: #include "xpars.h" ! 37: #include "xsrch.h" ! 38: #include "objects.h" ! 39: #include "oflags.h" ! 40: #include "oindex.h" ! 41: #include "clock.h" ! 42: ! 43: #include "advers.h" ! 44: #include "verbs.h" ! 45: #include "flags.h" ! 46: C ! 47: C FUNCTIONS AND DATA ! 48: C ! 49: QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0 ! 50: DATA MXNOP/39/,MXJOKE/64/ ! 51: DATA JOKES/4,5,3,304,305,306,307,308,309,310,311,312, ! 52: & 313,5314,5319,324,325,883,884,120,120,0,0,0,0/ ! 53: DATA ANSWER/0,6,1,6,2,5,3,5,4,3,4,6,4,6,4,5, ! 54: & 5,5,5,4,5,6,6,10,7,4,7,6/ ! 55: DATA ANSSTR/'T','E','M','P','L','E', ! 56: & 'F','O','R','E','S','T', ! 57: & '3','0','0','0','3', ! 58: & 'F','L','A','S','K', ! 59: & 'R','U','B', ! 60: & 'F','O','N','D','L','E', ! 61: & 'C','A','R','R','E','S', ! 62: & 'T','O','U','C','H', ! 63: & 'B','O','N','E','S', ! 64: & 'B','O','D','Y', ! 65: & 'S','K','E','L','E','T', ! 66: & 'R','U','S','T','Y','K','N','I','F','E', ! 67: & 'N','O','N','E', ! 68: & 'N','O','W','H','E','R','\0'/ ! 69: C SVERBS, PAGE 2 ! 70: C ! 71: SVERBS=.TRUE. ! 72: C !ASSUME WINS. ! 73: IF(PRSO.NE.0) ODO2=ODESC2(PRSO) ! 74: C !SET UP DESCRIPTORS. ! 75: IF(PRSI.NE.0) ODI2=ODESC2(PRSI) ! 76: C ! 77: IF(RI.EQ.0) CALL BUG(7,RI) ! 78: C !ZERO IS VERBOTEN. ! 79: IF(RI.LE.MXNOP) RETURN ! 80: C !NOP? ! 81: IF(RI.LE.MXJOKE) GO TO 100 ! 82: C !JOKE? ! 83: GO TO (65000,66000,67000,68000,69000, ! 84: & 1000,2000,3000,4000,5000,6000,7000,8000,9000,10000, ! 85: & 11000,12000,13000,14000,15000,16000,17000,18000,19000,20000, ! 86: & 21000,22000,23000,24000,25000,26000,27000), ! 87: & (RI-MXJOKE) ! 88: CALL BUG(7,RI) ! 89: C ! 90: C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE. ! 91: C ! 92: 10 SVERBS=.FALSE. ! 93: C !LOSE. ! 94: RETURN ! 95: C ! 96: C JOKE PROCESSOR. ! 97: C FIND PROPER ENTRY IN JOKES, USE IT TO SELECT STRING TO PRINT. ! 98: C ! 99: 100 I=JOKES(RI-MXNOP) ! 100: C !GET TABLE ENTRY. ! 101: J=I/1000 ! 102: C !ISOLATE # STRINGS. ! 103: IF(J.NE.0) I=MOD(I,1000)+RND(J) ! 104: C !IF RANDOM, CHOOSE. ! 105: CALL RSPEAK(I) ! 106: C !PRINT JOKE. ! 107: RETURN ! 108: C SVERBS, PAGE 2A ! 109: C ! 110: C V65-- ROOM ! 111: C ! 112: 65000 SVERBS=RMDESC(2) ! 113: C !DESCRIBE ROOM ONLY. ! 114: RETURN ! 115: C ! 116: C V66-- OBJECTS ! 117: C ! 118: 66000 SVERBS=RMDESC(1) ! 119: C !DESCRIBE OBJ ONLY. ! 120: IF(.NOT.TELFLG) CALL RSPEAK(138) ! 121: C !NO OBJECTS. ! 122: RETURN ! 123: C ! 124: C V67-- RNAME ! 125: C ! 126: 67000 CALL RSPEAK(RDESC2-HERE) ! 127: C !SHORT ROOM NAME. ! 128: RETURN ! 129: C ! 130: C V68-- RESERVED ! 131: C ! 132: 68000 RETURN ! 133: C ! 134: C V69-- RESERVED ! 135: C ! 136: 69000 RETURN ! 137: C SVERBS, PAGE 3 ! 138: C ! 139: C V70-- BRIEF. SET FLAG. ! 140: C ! 141: 1000 BRIEFF=.TRUE. ! 142: C !BRIEF DESCRIPTIONS. ! 143: SUPERF=.FALSE. ! 144: CALL RSPEAK(326) ! 145: RETURN ! 146: C ! 147: C V71-- VERBOSE. CLEAR FLAGS. ! 148: C ! 149: 2000 BRIEFF=.FALSE. ! 150: C !LONG DESCRIPTIONS. ! 151: SUPERF=.FALSE. ! 152: CALL RSPEAK(327) ! 153: RETURN ! 154: C ! 155: C V72-- SUPERBRIEF. SET FLAG. ! 156: C ! 157: 3000 SUPERF=.TRUE. ! 158: CALL RSPEAK(328) ! 159: RETURN ! 160: C ! 161: C V73-- STAY (USED IN ENDGAME). ! 162: C ! 163: 4000 IF(WINNER.NE.AMASTR) GO TO 4100 ! 164: C !TELL MASTER, STAY. ! 165: CALL RSPEAK(781) ! 166: C !HE DOES. ! 167: CTICK(CEVFOL)=0 ! 168: C !NOT FOLLOWING. ! 169: RETURN ! 170: C ! 171: 4100 IF(WINNER.EQ.PLAYER) CALL RSPEAK(664) ! 172: C !JOKE. ! 173: RETURN ! 174: C ! 175: C V74-- VERSION. PRINT INFO. ! 176: C ! 177: #ifdef PDP ! 178: 5000 call prvers(vmaj,vmin,vedit) ! 179: #else ! 180: 5000 WRITE(OUTCH,5010) VMAJ,VMIN,VEDIT ! 181: #ifdef NOCC ! 182: 5010 FORMAT('V',I1,'.',I2,A1) ! 183: #else NOCC ! 184: 5010 FORMAT(' V',I1,'.',I2,A1) ! 185: #endif NOCC ! 186: #endif PDP ! 187: TELFLG=.TRUE. ! 188: RETURN ! 189: C ! 190: C V75-- SWIM. ALWAYS A JOKE. ! 191: C ! 192: 6000 I=330 ! 193: C !ASSUME WATER. ! 194: IF(and(RFLAG(HERE),(RWATER+RFILL)).EQ.0) ! 195: & I=331+RND(3) ! 196: CALL RSPEAK(I) ! 197: RETURN ! 198: C ! 199: C V76-- GERONIMO. IF IN BARREL, FATAL, ELSE JOKE. ! 200: C ! 201: 7000 IF(HERE.EQ.MBARR) GO TO 7100 ! 202: C !IN BARREL? ! 203: CALL RSPEAK(334) ! 204: C !NO, JOKE. ! 205: RETURN ! 206: C ! 207: 7100 CALL JIGSUP(335) ! 208: C !OVER FALLS. ! 209: RETURN ! 210: C ! 211: C V77-- SINBAD ET AL. CHASE CYCLOPS, ELSE JOKE. ! 212: C ! 213: 8000 IF((HERE.EQ.MCYCL).AND.QHERE(CYCLO,HERE)) GO TO 8100 ! 214: CALL RSPEAK(336) ! 215: C !NOT HERE, JOKE. ! 216: RETURN ! 217: C ! 218: 8100 CALL NEWSTA(CYCLO,337,0,0,0) ! 219: C !CYCLOPS FLEES. ! 220: CYCLOF=.TRUE. ! 221: C !SET ALL FLAGS. ! 222: MAGICF=.TRUE. ! 223: OFLAG2(CYCLO)=and(OFLAG2(CYCLO), not(FITEBT)) ! 224: RETURN ! 225: C ! 226: C V78-- WELL. OPEN DOOR, ELSE JOKE. ! 227: C ! 228: 9000 IF(RIDDLF.OR.(HERE.NE.RIDDL)) GO TO 9100 ! 229: C !IN RIDDLE ROOM? ! 230: RIDDLF=.TRUE. ! 231: C !YES, SOLVED IT. ! 232: CALL RSPEAK(338) ! 233: RETURN ! 234: C ! 235: 9100 CALL RSPEAK(339) ! 236: C !WELL, WHAT? ! 237: RETURN ! 238: C ! 239: C V79-- PRAY. IF IN TEMP2, POOF ! 240: C ! ! 241: C ! 242: 10000 IF(HERE.NE.TEMP2) GO TO 10050 ! 243: C !IN TEMPLE? ! 244: IF(MOVETO(FORE1,WINNER)) GO TO 10100 ! 245: C !FORE1 STILL THERE? ! 246: 10050 CALL RSPEAK(340) ! 247: C !JOKE. ! 248: RETURN ! 249: C ! 250: 10100 F=RMDESC(3) ! 251: C !MOVED, DESCRIBE. ! 252: RETURN ! 253: C ! 254: C V80-- TREASURE. IF IN TEMP1, POOF ! 255: C ! ! 256: C ! 257: 11000 IF(HERE.NE.TEMP1) GO TO 11050 ! 258: C !IN TEMPLE? ! 259: IF(MOVETO(TREAS,WINNER)) GO TO 10100 ! 260: C !TREASURE ROOM THERE? ! 261: 11050 CALL RSPEAK(341) ! 262: C !NOTHING HAPPENS. ! 263: RETURN ! 264: C ! 265: C V81-- TEMPLE. IF IN TREAS, POOF ! 266: C ! ! 267: C ! 268: 12000 IF(HERE.NE.TREAS) GO TO 12050 ! 269: C !IN TREASURE? ! 270: IF(MOVETO(TEMP1,WINNER)) GO TO 10100 ! 271: C !TEMP1 STILL THERE? ! 272: 12050 CALL RSPEAK(341) ! 273: C !NOTHING HAPPENS. ! 274: RETURN ! 275: C ! 276: C V82-- BLAST. USUALLY A JOKE. ! 277: C ! 278: 13000 I=342 ! 279: C !DONT UNDERSTAND. ! 280: IF(PRSO.EQ.SAFE) I=252 ! 281: C !JOKE FOR SAFE. ! 282: CALL RSPEAK(I) ! 283: RETURN ! 284: C ! 285: C V83-- SCORE. PRINT SCORE. ! 286: C ! 287: 14000 CALL SCORE(.FALSE.) ! 288: RETURN ! 289: C ! 290: C V84-- QUIT. FINISH OUT THE GAME. ! 291: C ! 292: 15000 CALL SCORE(.TRUE.) ! 293: C !TELLL SCORE. ! 294: IF(.NOT.YESNO(343,0,0)) RETURN ! 295: C !ASK FOR Y/N DECISION. ! 296: #ifdef PDP ! 297: C close routine moved to exit for pdp version ! 298: #else ! 299: CLOSE (DBCH) ! 300: #endif PDP ! 301: CALL EXIT ! 302: C !BYE. ! 303: C SVERBS, PAGE 4 ! 304: C ! 305: C V85-- FOLLOW (USED IN ENDGAME) ! 306: C ! 307: 16000 IF(WINNER.NE.AMASTR) RETURN ! 308: C !TELL MASTER, FOLLOW. ! 309: CALL RSPEAK(782) ! 310: CTICK(CEVFOL)=-1 ! 311: C !STARTS FOLLOWING. ! 312: RETURN ! 313: C ! 314: C V86-- WALK THROUGH ! 315: C ! 316: 17000 IF((SCOLRM.EQ.0).OR.((PRSO.NE.SCOL).AND. ! 317: & ((PRSO.NE.WNORT).OR.(HERE.NE.BKBOX)))) GO TO 17100 ! 318: SCOLAC=SCOLRM ! 319: C !WALKED THRU SCOL. ! 320: PRSO=0 ! 321: C !FAKE OUT FROMDR. ! 322: CTICK(CEVSCL)=6 ! 323: C !START ALARM. ! 324: CALL RSPEAK(668) ! 325: C !DISORIENT HIM. ! 326: F=MOVETO(SCOLRM,WINNER) ! 327: C !INTO ROOM. ! 328: F=RMDESC(3) ! 329: C !DESCRIBE. ! 330: RETURN ! 331: C ! 332: 17100 IF(HERE.NE.SCOLAC) GO TO 17300 ! 333: C !ON OTHER SIDE OF SCOL? ! 334: DO 17200 I=1,12,3 ! 335: C !WALK THRU PROPER WALL? ! 336: IF((SCOLWL(I).EQ.HERE).AND.(SCOLWL(I+1).EQ.PRSO)) ! 337: & GO TO 17500 ! 338: 17200 CONTINUE ! 339: C ! 340: 17300 IF(and(OFLAG1(PRSO),TAKEBT).NE.0) GO TO 17400 ! 341: I=669 ! 342: C !NO, JOKE. ! 343: IF(PRSO.EQ.SCOL) I=670 ! 344: C !SPECIAL JOKE FOR SCOL. ! 345: CALL RSPSUB(I,ODO2) ! 346: RETURN ! 347: C ! 348: 17400 I=671 ! 349: C !JOKE. ! 350: IF(OROOM(PRSO).NE.0) I=552+RND(5) ! 351: C !SPECIAL JOKES IF CARRY. ! 352: CALL RSPEAK(I) ! 353: RETURN ! 354: C ! 355: 17500 PRSO=SCOLWL(I+2) ! 356: C !THRU SCOL WALL... ! 357: DO 17600 I=1,8,2 ! 358: C !FIND MATCHING ROOM. ! 359: IF(PRSO.EQ.SCOLDR(I)) SCOLRM=SCOLDR(I+1) ! 360: 17600 CONTINUE ! 361: C !DECLARE NEW SCOLRM. ! 362: CTICK(CEVSCL)=0 ! 363: C !CANCEL ALARM. ! 364: CALL RSPEAK(668) ! 365: C !DISORIENT HIM. ! 366: F=MOVETO(BKBOX,WINNER) ! 367: C !BACK IN BOX ROOM. ! 368: F=RMDESC(3) ! 369: RETURN ! 370: C ! 371: C V87-- RING. A JOKE. ! 372: C ! 373: 18000 I=359 ! 374: C !CANT RING. ! 375: IF(PRSO.EQ.BELL) I=360 ! 376: C !DING, DONG. ! 377: CALL RSPEAK(I) ! 378: C !JOKE. ! 379: RETURN ! 380: C ! 381: C V88-- BRUSH. JOKE WITH OBSCURE TRAP. ! 382: C ! 383: 19000 IF(PRSO.EQ.TEETH) GO TO 19100 ! 384: C !BRUSH TEETH? ! 385: CALL RSPEAK(362) ! 386: C !NO, JOKE. ! 387: RETURN ! 388: C ! 389: 19100 IF(PRSI.NE.0) GO TO 19200 ! 390: C !WITH SOMETHING? ! 391: CALL RSPEAK(363) ! 392: C !NO, JOKE. ! 393: RETURN ! 394: C ! 395: 19200 IF((PRSI.EQ.PUTTY).AND.(OADV(PUTTY).EQ.WINNER)) ! 396: & GO TO 19300 ! 397: CALL RSPSUB(364,ODI2) ! 398: C !NO, JOKE. ! 399: RETURN ! 400: C ! 401: 19300 CALL JIGSUP(365) ! 402: C !YES, DEAD ! 403: C ! ! 404: C ! ! 405: C ! ! 406: C ! ! 407: C ! ! 408: RETURN ! 409: C SVERBS, PAGE 5 ! 410: C ! 411: C V89-- DIG. UNLESS SHOVEL, A JOKE. ! 412: C ! 413: 20000 IF(PRSO.EQ.SHOVE) RETURN ! 414: C !SHOVEL? ! 415: I=392 ! 416: C !ASSUME TOOL. ! 417: IF(and(OFLAG1(PRSO),TOOLBT).EQ.0) I=393 ! 418: CALL RSPSUB(I,ODO2) ! 419: RETURN ! 420: C ! 421: C V90-- TIME. PRINT OUT DURATION OF GAME. ! 422: C ! 423: #ifdef PDP ! 424: C no duration time available for pdp version (removed ! 425: C to make things fit) ! 426: 21000 TELFLG=.TRUE. ! 427: RETURN ! 428: #else ! 429: 21000 CALL GTTIME(K) ! 430: C !GET PLAY TIME. ! 431: I=K/60 ! 432: J=MOD(K,60) ! 433: C ! 434: #ifdef NOCC ! 435: IF(I.EQ.0.AND.J.EQ.1) WRITE(OUTCH,21010) J ! 436: IF(I.EQ.0.AND.J.NE.1) WRITE(OUTCH,21011) J ! 437: IF(I.EQ.1.AND.J.EQ.1) WRITE(OUTCH,21012) I,J ! 438: IF(I.EQ.1.AND.J.NE.1) WRITE(OUTCH,21013) I,J ! 439: IF(I.GE.2.AND.J.EQ.1) WRITE(OUTCH,21014) I,J ! 440: IF(I.GE.2.AND.J.NE.1) WRITE(OUTCH,21015) I,J ! 441: TELFLG=.TRUE. ! 442: RETURN ! 443: C ! 444: 21010 FORMAT('You have been playing Dungeon for ',I2,' minute.') ! 445: 21011 FORMAT('You have been playing Dungeon for ',I2,' minutes.') ! 446: 21012 FORMAT('You have been playing Dungeon for ',I3,' hour and ', ! 447: & I2,' minute.') ! 448: 21013 FORMAT('You have been playing Dungeon for ',I3,' hour and ', ! 449: & I2,' minutes.') ! 450: 21014 FORMAT('You have been playing Dungeon for ',I3,' hours and ', ! 451: & I2,' minute.') ! 452: 21015 FORMAT('You have been playing Dungeon for ',I3,' hours and ', ! 453: & I2,' minutes.') ! 454: #else NOCC ! 455: WRITE(OUTCH,21010) ! 456: IF(I.NE.0) WRITE(OUTCH,21011) I ! 457: IF(I.GE.2) WRITE(OUTCH,21012) ! 458: IF(I.EQ.1) WRITE(OUTCH,21013) ! 459: IF(J.EQ.1) WRITE(OUTCH,21014) J ! 460: IF(J.NE.1) WRITE(OUTCH,21015) J ! 461: TELFLG=.TRUE. ! 462: RETURN ! 463: C ! 464: 21010 FORMAT(' You have been playing Dungeon for ',$) ! 465: 21011 FORMAT('+',I3,' hour',$) ! 466: 21012 FORMAT('+s and ',$) ! 467: 21013 FORMAT('+ and ',$) ! 468: 21014 FORMAT('+',I2,' minute.') ! 469: 21015 FORMAT('+',I2,' minutes.') ! 470: #endif NOCC ! 471: #endif PDP ! 472: C ! 473: C V91-- LEAP. USUALLY A JOKE, WITH A CATCH. ! 474: C ! 475: 22000 IF(PRSO.EQ.0) GO TO 22200 ! 476: C !OVER SOMETHING? ! 477: IF(QHERE(PRSO,HERE)) GO TO 22100 ! 478: C !HERE? ! 479: CALL RSPEAK(447) ! 480: C !NO, JOKE. ! 481: RETURN ! 482: C ! 483: 22100 IF(and(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 22300 ! 484: CALL RSPSUB(448,ODO2) ! 485: C !CANT JUMP VILLAIN. ! 486: RETURN ! 487: C ! 488: 22200 IF(.NOT.FINDXT(XDOWN,HERE)) GO TO 22300 ! 489: C !DOWN EXIT? ! 490: IF((XTYPE.EQ.XNO).OR.((XTYPE.EQ.XCOND).AND. ! 491: & .NOT.FLAGS(XFLAG))) GO TO 22400 ! 492: 22300 CALL RSPEAK(314+RND(5)) ! 493: C !WHEEEE ! 494: C ! ! 495: RETURN ! 496: C ! 497: 22400 CALL JIGSUP(449+RND(4)) ! 498: C !FATAL LEAP. ! 499: RETURN ! 500: C SVERBS, PAGE 6 ! 501: C ! 502: C V92-- LOCK. ! 503: C ! 504: 23000 IF((PRSO.EQ.GRATE).AND.(HERE.EQ.MGRAT)) ! 505: & GO TO 23200 ! 506: 23100 CALL RSPEAK(464) ! 507: C !NOT LOCK GRATE. ! 508: RETURN ! 509: C ! 510: 23200 GRUNLF=.FALSE. ! 511: C !GRATE NOW LOCKED. ! 512: CALL RSPEAK(214) ! 513: TRAVEL(REXIT(HERE)+1)=214 ! 514: C !CHANGE EXIT STATUS. ! 515: RETURN ! 516: C ! 517: C V93-- UNLOCK ! 518: C ! 519: 24000 IF((PRSO.NE.GRATE).OR.(HERE.NE.MGRAT)) ! 520: & GO TO 23100 ! 521: IF(PRSI.EQ.KEYS) GO TO 24200 ! 522: C !GOT KEYS? ! 523: CALL RSPSUB(465,ODI2) ! 524: C !NO, JOKE. ! 525: RETURN ! 526: C ! 527: 24200 GRUNLF=.TRUE. ! 528: C !UNLOCK GRATE. ! 529: CALL RSPEAK(217) ! 530: TRAVEL(REXIT(HERE)+1)=217 ! 531: C !CHANGE EXIT STATUS. ! 532: RETURN ! 533: C ! 534: C V94-- DIAGNOSE. ! 535: C ! 536: 25000 I=FIGHTS(WINNER,.FALSE.) ! 537: C !GET FIGHTS STRENGTH. ! 538: J=ASTREN(WINNER) ! 539: C !GET HEALTH. ! 540: K=MIN0(I+J,4) ! 541: C !GET STATE. ! 542: IF(.NOT.CFLAG(CEVCUR)) J=0 ! 543: C !IF NO WOUNDS. ! 544: L=MIN0(4,IABS(J)) ! 545: C !SCALE. ! 546: CALL RSPEAK(473+L) ! 547: C !DESCRIBE HEALTH. ! 548: I=(30*(-J-1))+CTICK(CEVCUR) ! 549: C !COMPUTE WAIT. ! 550: C ! 551: #ifdef PDP ! 552: if(J .ne. 0) call cured(I) ! 553: #else ! 554: IF(J.NE.0) WRITE(OUTCH,25100) I ! 555: #ifdef NOCC ! 556: 25100 FORMAT('You will be cured after ',I3,' moves.') ! 557: #else NOCC ! 558: 25100 FORMAT(' You will be cured after ',I3,' moves.') ! 559: #endif NOCC ! 560: #endif PDP ! 561: C ! 562: CALL RSPEAK(478+K) ! 563: C !HOW MUCH MORE? ! 564: IF(DEATHS.NE.0) CALL RSPEAK(482+DEATHS) ! 565: C !HOW MANY DEATHS? ! 566: RETURN ! 567: C SVERBS, PAGE 7 ! 568: C ! 569: C V95-- INCANT ! 570: C ! 571: 26000 DO 26100 I=1,6 ! 572: C !SET UP PARSE. ! 573: PP1(I)=' ' ! 574: PP2(I)=' ' ! 575: 26100 CONTINUE ! 576: WP=1 ! 577: C !WORD POINTER. ! 578: CP=1 ! 579: C !CHAR POINTER. ! 580: IF(PRSCON.LE.1) GO TO 26300 ! 581: DO 26200 I=PRSCON,INLNT ! 582: C !PARSE INPUT ! 583: IF(INBUF(I).EQ.',') GO TO 26300 ! 584: C !END OF PHRASE? ! 585: IF(INBUF(I).NE.' ') GO TO 26150 ! 586: C !SPACE? ! 587: IF(CP.NE.1) WP=WP+1 ! 588: CP=1 ! 589: GO TO 26200 ! 590: 26150 IF(WP.EQ.1) PP1(CP)=INBUF(I) ! 591: C !STUFF INTO HOLDER. ! 592: IF(WP.EQ.2) PP2(CP)=INBUF(I) ! 593: CP=MIN0(CP+1,6) ! 594: 26200 CONTINUE ! 595: C ! 596: 26300 PRSCON=1 ! 597: C !KILL REST OF LINE. ! 598: IF(PP1(1).NE.' ') GO TO 26400 ! 599: C !ANY INPUT? ! 600: CALL RSPEAK(856) ! 601: C !NO, HO HUM. ! 602: RETURN ! 603: C ! 604: 26400 CALL ENCRYP(PP1,CH) ! 605: C !COMPUTE RESPONSE. ! 606: IF(PP2(1).NE.' ') GO TO 26600 ! 607: C !TWO PHRASES? ! 608: C ! 609: IF(SPELLF) GO TO 26550 ! 610: C !HE'S TRYING TO LEARN. ! 611: IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 26575 ! 612: SPELLF=.TRUE. ! 613: C !TELL HIM. ! 614: TELFLG=.TRUE. ! 615: #ifdef PDP ! 616: call voice(PP1,CH) ! 617: #else ! 618: WRITE(OUTCH,26510) PP1,CH ! 619: #ifdef NOCC ! 620: 26510 FORMAT('A hollow voice replies: "',6A1,1X,6A1,'".') ! 621: #else NOCC ! 622: 26510 FORMAT(' A hollow voice replies: "',6A1,1X,6A1,'".') ! 623: #endif NOCC ! 624: #endif PDP ! 625: C ! 626: RETURN ! 627: C ! 628: 26550 CALL RSPEAK(857) ! 629: C !HE'S GOT ONE ALREADY. ! 630: RETURN ! 631: C ! 632: 26575 CALL RSPEAK(858) ! 633: C !HE'S NOT IN ENDGAME. ! 634: RETURN ! 635: C ! 636: 26600 IF(and(RFLAG(TSTRS),RSEEN).NE.0) GO TO 26800 ! 637: DO 26700 I=1,6 ! 638: IF(PP2(I).NE.CH(I)) GO TO 26575 ! 639: C !WRONG. ! 640: 26700 CONTINUE ! 641: SPELLF=.TRUE. ! 642: C !IT WORKS. ! 643: CALL RSPEAK(859) ! 644: CTICK(CEVSTE)=1 ! 645: C !FORCE START. ! 646: RETURN ! 647: C ! 648: 26800 CALL RSPEAK(855) ! 649: C !TOO LATE. ! 650: RETURN ! 651: C SVERBS, PAGE 8 ! 652: C ! 653: C V96-- ANSWER ! 654: C ! 655: 27000 IF((PRSCON.GT.1).AND. ! 656: & (HERE.EQ.FDOOR).AND.INQSTF) ! 657: & GO TO 27100 ! 658: CALL RSPEAK(799) ! 659: C !NO ONE LISTENS. ! 660: PRSCON=1 ! 661: RETURN ! 662: C ! 663: 27100 K=1 ! 664: C !POINTER INTO ANSSTR. ! 665: DO 27300 J=1,28,2 ! 666: C !CHECK ANSWERS. ! 667: NEWK=K+ANSWER(J+1) ! 668: C !COMPUTE NEXT K. ! 669: IF(QUESNO.NE.ANSWER(J)) GO TO 27300 ! 670: C !ONLY CHECK PROPER ANS. ! 671: I=PRSCON-1 ! 672: C !SCAN ANSWER. ! 673: DO 27200 L=K,NEWK-1 ! 674: 27150 I=I+1 ! 675: C !SKIP INPUT BLANKS. ! 676: IF(I.GT.INLNT) GO TO 27300 ! 677: C !END OF INPUT? LOSE. ! 678: IF(INBUF(I).EQ.' ') GO TO 27150 ! 679: IF(INBUF(I).NE.ANSSTR(L)) GO TO 27300 ! 680: 27200 CONTINUE ! 681: GO TO 27500 ! 682: C !RIGHT ANSWER. ! 683: 27300 K=NEWK ! 684: C ! 685: PRSCON=1 ! 686: C !KILL REST OF LINE. ! 687: NQATT=NQATT+1 ! 688: C !WRONG, CRETIN. ! 689: IF(NQATT.GE.5) GO TO 27400 ! 690: C !TOO MANY WRONG? ! 691: CALL RSPEAK(800+NQATT) ! 692: C !NO, TRY AGAIN. ! 693: RETURN ! 694: C ! 695: 27400 CALL RSPEAK(826) ! 696: C !ALL OVER. ! 697: CFLAG(CEVINQ)=.FALSE. ! 698: C !LOSE. ! 699: RETURN ! 700: C ! 701: 27500 PRSCON=1 ! 702: C !KILL REST OF LINE. ! 703: CORRCT=CORRCT+1 ! 704: C !GOT IT RIGHT. ! 705: CALL RSPEAK(800) ! 706: C !HOORAY. ! 707: IF(CORRCT.GE.3) GO TO 27600 ! 708: C !WON TOTALLY? ! 709: CTICK(CEVINQ)=2 ! 710: C !NO, START AGAIN. ! 711: QUESNO=MOD(QUESNO+3,8) ! 712: NQATT=0 ! 713: CALL RSPEAK(769) ! 714: C !ASK NEXT QUESTION. ! 715: CALL RSPEAK(770+QUESNO) ! 716: RETURN ! 717: C ! 718: 27600 CALL RSPEAK(827) ! 719: C !QUIZ OVER, ! 720: CFLAG(CEVINQ)=.FALSE. ! 721: OFLAG2(QDOOR)=or(OFLAG2(QDOOR),OPENBT) ! 722: RETURN ! 723: C ! 724: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.