|
|
1.1 ! root 1: C RESIDENT SUBROUTINES FOR DUNGEON ! 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 RSPEAK-- OUTPUT RANDOM MESSAGE ROUTINE ! 8: C ! 9: C CALLED BY-- ! 10: C ! 11: C CALL RSPEAK(MSGNUM) ! 12: C ! 13: SUBROUTINE RSPEAK(N) ! 14: IMPLICIT INTEGER(A-Z) ! 15: C ! 16: CALL RSPSB2(N,0,0) ! 17: RETURN ! 18: END ! 19: C RSPSUB-- OUTPUT RANDOM MESSAGE WITH SUBSTITUTABLE ARGUMENT ! 20: C ! 21: C CALLED BY-- ! 22: C ! 23: C CALL RSPSUB(MSGNUM,SUBNUM) ! 24: C ! 25: SUBROUTINE RSPSUB(N,S1) ! 26: IMPLICIT INTEGER(A-Z) ! 27: C ! 28: CALL RSPSB2(N,S1,0) ! 29: RETURN ! 30: END ! 31: C RSPSB2-- OUTPUT RANDOM MESSAGE WITH UP TO TWO SUBSTITUTABLE ARGUMENTS ! 32: C ! 33: C CALLED BY-- ! 34: C ! 35: C CALL RSPSB2(MSGNUM,SUBNUM1,SUBNUM2) ! 36: C ! 37: SUBROUTINE RSPSB2(N,S1,S2) ! 38: IMPLICIT INTEGER(A-Z) ! 39: #ifndef PDP ! 40: CHARACTER*74 B1,B2,B3 ! 41: INTEGER*2 OLDREC,NEWREC,JREC ! 42: #endif PDP ! 43: C ! 44: C DECLARATIONS ! 45: C ! 46: #include "gamestate.h" ! 47: C ! 48: #ifdef PDP ! 49: TELFLG=.TRUE. ! 50: C ! 51: C use C routine to access data base ! 52: C ! 53: call rspsb3(N,S1,S2) ! 54: return ! 55: #else ! 56: #include "mindex.h" ! 57: #include "io.h" ! 58: C ! 59: C CONVERT ALL ARGUMENTS FROM DICTIONARY NUMBERS (IF POSITIVE) ! 60: C TO ABSOLUTE RECORD NUMBERS. ! 61: C ! 62: X=N ! 63: C !SET UP WORK VARIABLES. ! 64: Y=S1 ! 65: Z=S2 ! 66: IF(X.GT.0) X=RTEXT(X) ! 67: C !IF >0, LOOK UP IN RTEXT. ! 68: IF(Y.GT.0) Y=RTEXT(Y) ! 69: IF(Z.GT.0) Z=RTEXT(Z) ! 70: X=IABS(X) ! 71: C !TAKE ABS VALUE. ! 72: Y=IABS(Y) ! 73: Z=IABS(Z) ! 74: IF(X.EQ.0) RETURN ! 75: C !ANYTHING TO DO? ! 76: TELFLG=.TRUE. ! 77: C !SAID SOMETHING. ! 78: C ! 79: READ(UNIT=DBCH,REC=X) OLDREC,B1 ! 80: C ! 81: 100 DO 150 I=1,74 ! 82: X1=and(X,31)+I ! 83: B1(I:I)=char(xor(ichar(B1(I:I)),X1)) ! 84: 150 CONTINUE ! 85: C ! 86: 200 IF(Y.EQ.0) GO TO 400 ! 87: C !ANY SUBSTITUTABLE? ! 88: DO 300 I=1,74 ! 89: C !YES, LOOK FOR #. ! 90: IF(B1(I:I).EQ.'#') GO TO 1000 ! 91: 300 CONTINUE ! 92: C ! 93: 400 DO 500 I=74,1,-1 ! 94: C !BACKSCAN FOR BLANKS. ! 95: IF(B1(I:I).NE.' ') GO TO 600 ! 96: 500 CONTINUE ! 97: C ! 98: 600 WRITE(OUTCH,650) (B1(J:J),J=1,I) ! 99: #ifdef NOCC ! 100: 650 FORMAT(74A1) ! 101: #else NOCC ! 102: 650 FORMAT(1X,74A1) ! 103: #endif NOCC ! 104: X=X+1 ! 105: C !ON TO NEXT RECORD. ! 106: READ(UNIT=DBCH,REC=X) NEWREC,B1 ! 107: IF(OLDREC.EQ.NEWREC) GO TO 100 ! 108: C !CONTINUATION? ! 109: RETURN ! 110: C !NO, EXIT. ! 111: C ! 112: C SUBSTITUTION WITH SUBSTITUTABLE AVAILABLE. ! 113: C I IS INDEX OF # IN B1. ! 114: C Y IS NUMBER OF RECORD TO SUBSTITUTE. ! 115: C ! 116: C PROCEDURE: ! 117: C 1) COPY REST OF B1 TO B2 ! 118: C 2) READ SUBSTITUTABLE OVER B1 ! 119: C 3) RESTORE TAIL OF ORIGINAL B1 ! 120: C ! 121: C THE IMPLICIT ASSUMPTION HERE IS THAT THE SUBSTITUTABLE STRING ! 122: C IS VERY SHORT (i.e. MUCH LESS THAN ONE RECORD). ! 123: C ! 124: 1000 K2=1 ! 125: C !TO ! 126: DO 1100 K1=I+1,74 ! 127: C !COPY REST OF B1. ! 128: B2(K2:K2)=B1(K1:K1) ! 129: K2=K2+1 ! 130: 1100 CONTINUE ! 131: C ! 132: C READ SUBSTITUTE STRING INTO B3, AND DECRYPT IT: ! 133: C ! 134: READ(UNIT=DBCH,REC=Y) JREC,B3 ! 135: DO 1150 K1=1,74 ! 136: X1=and(Y,31)+K1 ! 137: B3(K1:K1)=char(xor(ICHAR(B3(K1:K1)),X1)) ! 138: 1150 CONTINUE ! 139: C ! 140: C FILL REMAINDER OF B1 WITH CHARACTERS FROM B3: ! 141: C ! 142: K2=1 ! 143: DO 1180 K1=I,74 ! 144: B1(K1:K1)=B3(K2:K2) ! 145: K2=K2+1 ! 146: 1180 CONTINUE ! 147: C ! 148: C FIND END OF SUBSTITUTE STRING IN B1: ! 149: C ! 150: DO 1200 J=74,1,-1 ! 151: C !ELIM TRAILING BLANKS. ! 152: IF(B1(J:J).NE.' ') GO TO 1300 ! 153: 1200 CONTINUE ! 154: C ! 155: C PUT TAIL END OF B1 (NOW IN B2) BACK INTO B1 AFTER SUBSTITUTE STRING: ! 156: C ! 157: 1300 K1=1 ! 158: C !FROM ! 159: DO 1400 K2=J+1,74 ! 160: C !COPY REST OF B1 BACK. ! 161: B1(K2:K2)=B2(K1:K1) ! 162: K1=K1+1 ! 163: 1400 CONTINUE ! 164: C ! 165: Y=Z ! 166: C !SET UP FOR NEXT ! 167: Z=0 ! 168: C !SUBSTITUTION AND ! 169: GO TO 200 ! 170: C !RECHECK LINE. ! 171: #endif PDP ! 172: C ! 173: END ! 174: C OBJACT-- APPLY OBJECTS FROM PARSE VECTOR ! 175: C ! 176: C DECLARATIONS ! 177: C ! 178: LOGICAL FUNCTION OBJACT(X) ! 179: IMPLICIT INTEGER (A-Z) ! 180: LOGICAL OAPPLI ! 181: #include "parser.h" ! 182: #include "objects.h" ! 183: C ! 184: OBJACT=.TRUE. ! 185: C !ASSUME WINS. ! 186: IF(PRSI.EQ.0) GO TO 100 ! 187: C !IND OBJECT? ! 188: IF(OAPPLI(OACTIO(PRSI),0)) RETURN ! 189: C !YES, LET IT HANDLE. ! 190: C ! 191: 100 IF(PRSO.EQ.0) GO TO 200 ! 192: C !DIR OBJECT? ! 193: IF(OAPPLI(OACTIO(PRSO),0)) RETURN ! 194: C !YES, LET IT HANDLE. ! 195: C ! 196: 200 OBJACT=.FALSE. ! 197: C !LOSES. ! 198: RETURN ! 199: END ! 200: #ifndef PDP ! 201: C BUG-- REPORT FATAL SYSTEM ERROR ! 202: C ! 203: C CALLED BY-- ! 204: C ! 205: C CALL BUG(NO,PAR) ! 206: C ! 207: SUBROUTINE BUG(A,B) ! 208: IMPLICIT INTEGER(A-Z) ! 209: #include "debug.h" ! 210: C ! 211: PRINT 100,A,B ! 212: IF(DBGFLG.NE.0) RETURN ! 213: CALL EXIT ! 214: C ! 215: #ifdef NOCC ! 216: 100 FORMAT('PROGRAM ERROR ',I2,', PARAMETER=',I6) ! 217: #else NOCC ! 218: 100 FORMAT(' PROGRAM ERROR ',I2,', PARAMETER=',I6) ! 219: #endif NOCC ! 220: END ! 221: #endif PDP ! 222: C NEWSTA-- SET NEW STATUS FOR OBJECT ! 223: C ! 224: C CALLED BY-- ! 225: C ! 226: C CALL NEWSTA(OBJECT,STRING,NEWROOM,NEWCON,NEWADV) ! 227: C ! 228: SUBROUTINE NEWSTA(O,R,RM,CN,AD) ! 229: IMPLICIT INTEGER(A-Z) ! 230: #include "objects.h" ! 231: C ! 232: CALL RSPEAK(R) ! 233: OROOM(O)=RM ! 234: OCAN(O)=CN ! 235: OADV(O)=AD ! 236: RETURN ! 237: END ! 238: C QHERE-- TEST FOR OBJECT IN ROOM ! 239: C ! 240: C DECLARATIONS ! 241: C ! 242: LOGICAL FUNCTION QHERE(OBJ,RM) ! 243: IMPLICIT INTEGER (A-Z) ! 244: #include "objects.h" ! 245: C ! 246: QHERE=.TRUE. ! 247: IF(OROOM(OBJ).EQ.RM) RETURN ! 248: C !IN ROOM? ! 249: DO 100 I=1,R2LNT ! 250: C !NO, SCH ROOM2. ! 251: IF((OROOM2(I).EQ.OBJ).AND.(RROOM2(I).EQ.RM)) RETURN ! 252: 100 CONTINUE ! 253: QHERE=.FALSE. ! 254: C !NOT PRESENT. ! 255: RETURN ! 256: END ! 257: C QEMPTY-- TEST FOR OBJECT EMPTY ! 258: C ! 259: C DECLARATIONS ! 260: C ! 261: LOGICAL FUNCTION QEMPTY(OBJ) ! 262: IMPLICIT INTEGER (A-Z) ! 263: #include "objects.h" ! 264: C ! 265: QEMPTY=.FALSE. ! 266: C !ASSUME LOSE. ! 267: DO 100 I=1,OLNT ! 268: IF(OCAN(I).EQ.OBJ) RETURN ! 269: C !INSIDE TARGET? ! 270: 100 CONTINUE ! 271: QEMPTY=.TRUE. ! 272: RETURN ! 273: END ! 274: C JIGSUP- YOU ARE DEAD ! 275: C ! 276: C DECLARATIONS ! 277: C ! 278: SUBROUTINE JIGSUP(DESC) ! 279: IMPLICIT INTEGER (A-Z) ! 280: LOGICAL YESNO,MOVETO,QHERE,F ! 281: INTEGER RLIST(9) ! 282: #include "parser.h" ! 283: #include "gamestate.h" ! 284: #include "state.h" ! 285: #include "io.h" ! 286: #include "debug.h" ! 287: #include "rooms.h" ! 288: #include "rflag.h" ! 289: #include "rindex.h" ! 290: #include "objects.h" ! 291: #include "oflags.h" ! 292: #include "oindex.h" ! 293: #include "advers.h" ! 294: #include "flags.h" ! 295: C ! 296: C FUNCTIONS AND DATA ! 297: C ! 298: DATA RLIST/8,6,36,35,34,4,34,6,5/ ! 299: C JIGSUP, PAGE 2 ! 300: C ! 301: CALL RSPEAK(DESC) ! 302: C !DESCRIBE SAD STATE. ! 303: PRSCON=1 ! 304: C !STOP PARSER. ! 305: IF(DBGFLG.NE.0) RETURN ! 306: C !IF DBG, EXIT. ! 307: AVEHIC(WINNER)=0 ! 308: C !GET RID OF VEHICLE. ! 309: IF(WINNER.EQ.PLAYER) GO TO 100 ! 310: C !HIMSELF? ! 311: CALL RSPSUB(432,ODESC2(AOBJ(WINNER))) ! 312: C !NO, SAY WHO DIED. ! 313: CALL NEWSTA(AOBJ(WINNER),0,0,0,0) ! 314: C !SEND TO HYPER SPACE. ! 315: RETURN ! 316: C ! 317: 100 IF(ENDGMF) GO TO 900 ! 318: C !NO RECOVERY IN END GAME. ! 319: IF(DEATHS.GE.2) GO TO 1000 ! 320: C !DEAD TWICE? KICK HIM OFF. ! 321: IF(.NOT.YESNO(10,9,8)) GO TO 1100 ! 322: C !CONTINUE? ! 323: C ! 324: DO 50 J=1,OLNT ! 325: C !TURN OFF FIGHTING. ! 326: IF(QHERE(J,HERE)) OFLAG2(J)=and(OFLAG2(J),not(FITEBT)) ! 327: 50 CONTINUE ! 328: C ! 329: DEATHS=DEATHS+1 ! 330: CALL SCRUPD(-10) ! 331: C !CHARGE TEN POINTS. ! 332: F=MOVETO(FORE1,WINNER) ! 333: C !REPOSITION HIM. ! 334: EGYPTF=.TRUE. ! 335: C !RESTORE COFFIN. ! 336: IF(OADV(COFFI).EQ.WINNER) CALL NEWSTA(COFFI,0,EGYPT,0,0) ! 337: OFLAG2(DOOR)=and(OFLAG2(DOOR),not(TCHBT)) ! 338: OFLAG1(ROBOT)=and(or(OFLAG1(ROBOT),VISIBT),not(NDSCBT)) ! 339: IF((OROOM(LAMP).NE.0).OR.(OADV(LAMP).EQ.WINNER)) ! 340: & CALL NEWSTA(LAMP,0,LROOM,0,0) ! 341: C ! 342: C NOW REDISTRIBUTE HIS VALUABLES AND OTHER BELONGINGS. ! 343: C ! 344: C THE LAMP HAS BEEN PLACED IN THE LIVING ROOM. ! 345: C THE FIRST 8 NON-VALUABLES ARE PLACED IN LOCATIONS AROUND THE HOUSE. ! 346: C HIS VALUABLES ARE PLACED AT THE END OF THE MAZE. ! 347: C REMAINING NON-VALUABLES ARE PLACED AT THE END OF THE MAZE. ! 348: C ! 349: I=1 ! 350: DO 200 J=1,OLNT ! 351: C !LOOP THRU OBJECTS. ! 352: IF((OADV(J).NE.WINNER).OR.(OTVAL(J).NE.0)) ! 353: & GO TO 200 ! 354: I=I+1 ! 355: IF(I.GT.9) GO TO 400 ! 356: C !MOVE TO RANDOM LOCATIONS. ! 357: CALL NEWSTA(J,0,RLIST(I),0,0) ! 358: 200 CONTINUE ! 359: C ! 360: 400 I=RLNT+1 ! 361: C !NOW MOVE VALUABLES. ! 362: NONOFL=RAIR+RWATER+RSACRD+REND ! 363: C !DONT MOVE HERE. ! 364: DO 300 J=1,OLNT ! 365: IF((OADV(J).NE.WINNER).OR.(OTVAL(J).EQ.0)) ! 366: & GO TO 300 ! 367: 250 I=I-1 ! 368: C !FIND NEXT ROOM. ! 369: IF(and(RFLAG(I),NONOFL).NE.0) GO TO 250 ! 370: CALL NEWSTA(J,0,I,0,0) ! 371: C !YES, MOVE. ! 372: 300 CONTINUE ! 373: C ! 374: DO 500 J=1,OLNT ! 375: C !NOW GET RID OF REMAINDER. ! 376: IF(OADV(J).NE.WINNER) GO TO 500 ! 377: 450 I=I-1 ! 378: C !FIND NEXT ROOM. ! 379: IF(and(RFLAG(I),NONOFL).NE.0) GO TO 450 ! 380: CALL NEWSTA(J,0,I,0,0) ! 381: 500 CONTINUE ! 382: RETURN ! 383: C ! 384: C CAN'T OR WON'T CONTINUE, CLEAN UP AND EXIT. ! 385: C ! 386: 900 CALL RSPEAK(625) ! 387: C !IN ENDGAME, LOSE. ! 388: GO TO 1100 ! 389: C ! 390: 1000 CALL RSPEAK(7) ! 391: C !INVOLUNTARY EXIT. ! 392: 1100 CALL SCORE(.FALSE.) ! 393: C !TELL SCORE. ! 394: #ifdef PDP ! 395: C file closed in exit routine ! 396: #else ! 397: CLOSE(DBCH) ! 398: #endif PDP ! 399: CALL EXIT ! 400: C ! 401: END ! 402: C OACTOR- GET ACTOR ASSOCIATED WITH OBJECT ! 403: C ! 404: C DECLARATIONS ! 405: C ! 406: INTEGER FUNCTION OACTOR(OBJ) ! 407: IMPLICIT INTEGER(A-Z) ! 408: #include "advers.h" ! 409: C ! 410: DO 100 I=1,ALNT ! 411: C !LOOP THRU ACTORS. ! 412: OACTOR=I ! 413: C !ASSUME FOUND. ! 414: IF(AOBJ(I).EQ.OBJ) RETURN ! 415: C !FOUND IT? ! 416: 100 CONTINUE ! 417: CALL BUG(40,OBJ) ! 418: C !NO, DIE. ! 419: RETURN ! 420: END ! 421: C PROB- COMPUTE PROBABILITY ! 422: C ! 423: C DECLARATIONS ! 424: C ! 425: LOGICAL FUNCTION PROB(G,B) ! 426: IMPLICIT INTEGER(A-Z) ! 427: #include "flags.h" ! 428: C ! 429: I=G ! 430: C !ASSUME GOOD LUCK. ! 431: IF(BADLKF) I=B ! 432: C !IF BAD, TOO BAD. ! 433: PROB=RND(100).LT.I ! 434: C !COMPUTE. ! 435: RETURN ! 436: END ! 437: C RMDESC-- PRINT ROOM DESCRIPTION ! 438: C ! 439: C RMDESC PRINTS A DESCRIPTION OF THE CURRENT ROOM. ! 440: C IT IS ALSO THE PROCESSOR FOR VERBS 'LOOK' AND 'EXAMINE'. ! 441: C ! 442: LOGICAL FUNCTION RMDESC(FULL) ! 443: C ! 444: C FULL= 0/1/2/3= SHORT/OBJ/ROOM/FULL ! 445: C ! 446: C DECLARATIONS ! 447: C ! 448: IMPLICIT INTEGER (A-Z) ! 449: LOGICAL LIT,RAPPLI ! 450: C LOGICAL PROB ! 451: #include "parser.h" ! 452: #include "gamestate.h" ! 453: #include "screen.h" ! 454: #include "rooms.h" ! 455: #include "rflag.h" ! 456: #include "xsrch.h" ! 457: #include "objects.h" ! 458: #include "advers.h" ! 459: #include "verbs.h" ! 460: #include "flags.h" ! 461: C RMDESC, PAGE 2 ! 462: C ! 463: RMDESC=.TRUE. ! 464: C !ASSUME WINS. ! 465: IF(PRSO.LT.XMIN) GO TO 50 ! 466: C !IF DIRECTION, ! 467: FROMDR=PRSO ! 468: C !SAVE AND ! 469: PRSO=0 ! 470: C !CLEAR. ! 471: 50 IF(HERE.EQ.AROOM(PLAYER)) GO TO 100 ! 472: C !PLAYER JUST MOVE? ! 473: CALL RSPEAK(2) ! 474: C !NO, JUST SAY DONE. ! 475: PRSA=WALKIW ! 476: C !SET UP WALK IN ACTION. ! 477: RETURN ! 478: C ! 479: 100 IF(LIT(HERE)) GO TO 300 ! 480: C !LIT? ! 481: CALL RSPEAK(430) ! 482: C !WARN OF GRUE. ! 483: RMDESC=.FALSE. ! 484: RETURN ! 485: C ! 486: 300 RA=RACTIO(HERE) ! 487: C !GET ROOM ACTION. ! 488: IF(FULL.EQ.1) GO TO 600 ! 489: C !OBJ ONLY? ! 490: I=RDESC2-HERE ! 491: C !ASSUME SHORT DESC. ! 492: IF((FULL.EQ.0) ! 493: & .AND.(SUPERF.OR.(((and(RFLAG(HERE),RSEEN)).NE.0) ! 494: C ! 495: C The next line means that when you request VERBOSE mode, you ! 496: C only get long room descriptions 20% of the time. I don't either ! 497: C like or understand this, so the mod. ensures VERBOSE works ! 498: C all the time. [email protected] 22/10/87 ! 499: C ! 500: C& .AND.(BRIEFF.OR.PROB(80,80))))) GO TO 400 ! 501: & .AND.BRIEFF))) GO TO 400 ! 502: I=RDESC1(HERE) ! 503: C !USE LONG. ! 504: IF((I.NE.0).OR.(RA.EQ.0)) GO TO 400 ! 505: C !IF GOT DESC, SKIP. ! 506: PRSA=LOOKW ! 507: C !PRETEND LOOK AROUND. ! 508: IF(.NOT.RAPPLI(RA)) GO TO 100 ! 509: C !ROOM HANDLES, NEW DESC? ! 510: PRSA=FOOW ! 511: C !NOP PARSER. ! 512: GO TO 500 ! 513: C ! 514: 400 CALL RSPEAK(I) ! 515: C !OUTPUT DESCRIPTION. ! 516: 500 IF(AVEHIC(WINNER).NE.0) CALL RSPSUB(431,ODESC2(AVEHIC(WINNER))) ! 517: C ! 518: 600 IF(FULL.NE.2) CALL PRINCR(FULL.NE.0,HERE) ! 519: RFLAG(HERE)=or(RFLAG(HERE),RSEEN) ! 520: IF((FULL.NE.0).OR.(RA.EQ.0)) RETURN ! 521: C !ANYTHING MORE? ! 522: PRSA=WALKIW ! 523: C !GIVE HIM A SURPISE. ! 524: IF(.NOT.RAPPLI(RA)) GO TO 100 ! 525: C !ROOM HANDLES, NEW DESC? ! 526: PRSA=FOOW ! 527: RETURN ! 528: C ! 529: END ! 530: C RAPPLI- ROUTING ROUTINE FOR ROOM APPLICABLES ! 531: C ! 532: C DECLARATIONS ! 533: C ! 534: LOGICAL FUNCTION RAPPLI(RI) ! 535: IMPLICIT INTEGER(A-Z) ! 536: LOGICAL RAPPL1,RAPPL2 ! 537: DATA NEWRMS/38/ ! 538: C ! 539: RAPPLI=.TRUE. ! 540: C !ASSUME WINS. ! 541: IF(RI.EQ.0) RETURN ! 542: C !IF ZERO, WIN. ! 543: IF(RI.LT.NEWRMS) RAPPLI=RAPPL1(RI) ! 544: C !IF OLD, PROCESSOR 1. ! 545: IF(RI.GE.NEWRMS) RAPPLI=RAPPL2(RI) ! 546: C !IF NEW, PROCESSOR 2. ! 547: RETURN ! 548: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.