1: #include "files.h" 2: 3: #ifndef INDXFILE 4: #define INDXFILE '/usr/games/lib/dunlib/dindx.dat' 5: #endif 6: #ifndef TEXTFILE 7: #define TEXTFILE '/usr/games/lib/dunlib/dtext.dat' 8: #endif 9: #ifndef WIZARDID 10: #define WIZARDID 0 11: #endif 12: 13: C INIT-- DUNGEON INITIALIZATION SUBROUTINE 14: C 15: C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142 16: C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED 17: C WRITTEN BY R. M. SUPNIK 18: C 19: C DECLARATIONS 20: C 21: LOGICAL FUNCTION INIT(X) 22: IMPLICIT INTEGER (A-Z) 23: #ifndef PDP 24: LOGICAL PROTCT 25: INTEGER DATARR(3) 26: #endif PDP 27: #include "parser.h" 28: #include "gamestate.h" 29: #include "state.h" 30: #include "screen.h" 31: #include "mindex.h" 32: C 33: C MISCELLANEOUS VARIABLES 34: C 35: COMMON /STAR/ MBASE,STRBIT 36: COMMON /VERS/ VMAJ,VMIN,VEDIT 37: COMMON /TIME/ PLTIME,SHOUR,SMIN,SSEC 38: #include "io.h" 39: #include "debug.h" 40: COMMON /HYPER/ HFACTR 41: #include "rooms.h" 42: #include "rflag.h" 43: #include "rindex.h" 44: #include "exits.h" 45: #include "curxt.h" 46: #include "xpars.h" 47: #include "objects.h" 48: #include "oindex.h" 49: #include "clock.h" 50: #include "villians.h" 51: #include "advers.h" 52: #include "flags.h" 53: C INIT, PAGE 2 54: C 55: #ifndef PDP 56: #ifdef SYSV 57: C make output unbuffered 58: call unbuf 59: C 60: #endif 61: C FIRST CHECK FOR PROTECTION VIOLATION 62: C 63: IF(PROTCT(X)) GO TO 10000 64: C !PROTECTION VIOLATION? 65: PRINT 10100 66: #ifdef NOCC 67: 10100 FORMAT('There appears before you a threatening figure clad ' 68: & 'all over'/'in heavy black armor. His legs seem like the ' 69: & 'massive trunk'/'of the oak tree. His broad shoulders and ' 70: & 'helmeted head loom'/'high over your own puny frame, and ' 71: & 'you realize that his powerful'/'arms could easily crush the ' 72: & 'very life from your body. There'/'hangs from his belt a ' 73: & 'veritable arsenal of deadly weapons:'/'sword, mace, ball ' 74: & 'and chain, dagger, lance, and trident.'/'He speaks with a ' 75: & 'commanding voice:'//20X,'"You shall not pass."'//'As ' 76: & 'he grabs you by the neck all grows dim about you.') 77: #else NOCC 78: 10100 FORMAT(' There appears before you a threatening figure clad ' 79: & 'all over'/' in heavy black armor. His legs seem like the ' 80: & 'massive trunk'/' of the oak tree. His broad shoulders and ' 81: & 'helmeted head loom'/' high over your own puny frame, and ' 82: & 'you realize that his powerful'/' arms could easily crush the ' 83: & 'very life from your body. There'/' hangs from his belt a ' 84: & 'veritable arsenal of deadly weapons:'/' sword, mace, ball ' 85: & 'and chain, dagger, lance, and trident.'/' He speaks with a ' 86: & 'commanding voice:'//20X,'"You shall not pass."'//' As ' 87: & 'he grabs you by the neck all grows dim about you.') 88: #endif NOCC 89: CALL EXIT 90: #endif PDP 91: C 92: C NOW START INITIALIZATION PROPER 93: C 94: #ifdef PDP 95: C 96: C Note: arrays FLAGS & SWITCH are initialized in the following 97: C DATA statements, instead of using DO loops and assignments 98: C as used before. This saves some code space. 99: C 100: DATA FLAGS/.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE., 101: & .FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE., 102: & .FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE., 103: & .TRUE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.TRUE., 104: & .FALSE.,.FALSE.,.FALSE.,.TRUE.,.FALSE.,.FALSE., 105: & .FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE., 106: & .FALSE.,.FALSE.,.FALSE.,.TRUE.,.TRUE.,.FALSE., 107: & .TRUE.,.FALSE.,.FALSE.,.FALSE./ 108: C 109: DATA SWITCH/0,0,0,0,0,0,0,0,0, 110: & 4,0,270,0,0,0,0,0, 111: & 1,1,0,0,10/ 112: C 113: C Note: SWITCH(13) or MLOC is initialized equal to MRB later. 114: C 115: C 116: DATA LTSHFT/10/ 117: DATA EGSCOR/0/ 118: DATA EGMXSC/0/ 119: DATA MXLOAD/100/ 120: DATA RWSCOR/0/ 121: DATA DEATHS/0/ 122: DATA MOVES/0/ 123: DATA PLTIME/0/ 124: DATA MUNGRM/0/ 125: DATA HS/0/ 126: DATA PRSA/0/ 127: DATA PRSI/0/ 128: DATA PRSO/0/ 129: DATA PRSCON/1/ 130: DATA OFLAG/0/ 131: DATA OACT/0/ 132: DATA OSLOT/0/ 133: DATA OPREP/0/ 134: DATA ONAME/0/ 135: DATA THFFLG/.FALSE./ 136: DATA THFACT/.TRUE./ 137: DATA SWDACT/.FALSE./ 138: DATA SWDSTA/0/ 139: C 140: DATA RECNO/1/ 141: DATA MBASE/0/ 142: DATA INPCH/5/ 143: DATA OUTCH/5/ 144: DATA DBCH/2/ 145: C 146: C INIT, PAGE 3 147: C 148: C 149: DATA DBGFLG/0/ 150: DATA PRSFLG/0/ 151: DATA GDTFLG/0/ 152: C 153: FROMDR=0 154: SCOLRM=0 155: SCOLAC=0 156: INIT=.FALSE. 157: MLOC=MRB 158: C 159: C INIT, PAGE 4 160: C 161: C NOW RESTORE FROM EXISTING INDEX FILE. 162: C 163: call intrd(i) 164: call intrd(j) 165: call intrd(k) 166: IF((I.NE.VMAJ).OR.(J.NE.VMIN)) 167: & GO TO 1925 168: C 169: call intrd(MXSCOR) 170: call intrd(STRBIT) 171: call intrd(EGMXSC) 172: C 173: call intrd(RLNT) 174: call intrd(RDESC2) 175: call aryrd(200,RDESC1) 176: call aryrd(200,REXIT) 177: call aryrd(200,RACTIO) 178: call aryrd(200,RVAL) 179: call aryrd(200,RFLAG) 180: C 181: call intrd(XLNT) 182: call aryrd(900,TRAVEL) 183: call intrd(OLNT) 184: call aryrd(220,ODESC1) 185: call aryrd(220,ODESC2) 186: call aryrd(220,ODESCO) 187: call aryrd(220,OACTIO) 188: call aryrd(220,OFLAG1) 189: call aryrd(220,OFLAG2) 190: call aryrd(220,OFVAL) 191: call aryrd(220,OTVAL) 192: call aryrd(220,OSIZE) 193: call aryrd(220,OCAPAC) 194: call aryrd(220,OROOM) 195: call aryrd(220,OADV) 196: call aryrd(220,OCAN) 197: call aryrd(220,OREAD) 198: C 199: call intrd(R2LNT) 200: call aryrd(20,OROOM2) 201: call aryrd(20,RROOM2) 202: C 203: call intrd(CLNT) 204: call aryrd(25,CTICK) 205: call aryrd(25,CACTIO) 206: C 207: do 990 i=1,25 208: cflag(i)=.TRUE. 209: call logrd(j) 210: if(j.EQ.0) CFLAG(i)=.FALSE. 211: 990 continue 212: C 213: call intrd(VLNT) 214: call aryrd(4,VILLNS) 215: call aryrd(4,VPROB) 216: call aryrd(4,VOPPS) 217: call aryrd(4,VBEST) 218: call aryrd(4,VMELEE) 219: C 220: call intrd(ALNT) 221: call aryrd(4,AROOM) 222: call aryrd(4,ASCORE) 223: call aryrd(4,AVEHIC) 224: call aryrd(4,AOBJ) 225: call aryrd(4,AACTIO) 226: call aryrd(4,ASTREN) 227: call aryrd(4,AFLAG) 228: C 229: call intrd(MBASE) 230: call intrd(MLNT) 231: C 232: C The RTEXT array is not used here, and isn't read (it's used 233: C in "speak.F") 234: C 235: call initnd 236: C 237: C INIT, PAGE 5 238: C 239: C THE INTERNAL DATA BASE IS NOW ESTABLISHED. 240: C SET UP TO PLAY THE GAME. 241: C 242: 1025 CALL ITIME(SHOUR,SMIN,SSEC) 243: CALL INIRND(or(SHOUR,or(SMIN,SSEC))) 244: C 245: WINNER=PLAYER 246: LASTIT=AOBJ(PLAYER) 247: HERE=AROOM(WINNER) 248: THFPOS=OROOM(THIEF) 249: BLOC=OROOM(BALLO) 250: INIT=.TRUE. 251: #ifdef debug 252: C 253: C Normally, PRSFLG is setable in gdt to allow seeing various 254: C parse results. Since the pdp version does not have gdt, 255: C PRSFLG is set to show full debugging info when debug is enabled. 256: C 257: PRSFLG=65535 258: #endif debug 259: C 260: C 261: RETURN 262: C INIT, PAGE 6 263: C 264: C ERRORS-- INIT FAILS. 265: C 266: 1925 continue 267: END 268: #else PDP 269: 10000 INIT=.FALSE. 270: C !ASSUME INIT FAILS. 271: MMAX=1050 272: C !SET UP ARRAY LIMITS. 273: OMAX=220 274: RMAX=200 275: VMAX=4 276: AMAX=4 277: CMAX=25 278: FMAX=46 279: SMAX=22 280: XMAX=900 281: R2MAX=20 282: DIRMAX=15 283: C 284: MLNT=0 285: C !INIT ARRAY COUNTERS. 286: OLNT=0 287: RLNT=0 288: VLNT=0 289: ALNT=0 290: CLNT=0 291: XLNT=1 292: R2LNT=0 293: C 294: LTSHFT=10 295: C !SET UP STATE VARIABLES. 296: MXSCOR=LTSHFT 297: EGSCOR=0 298: EGMXSC=0 299: MXLOAD=100 300: RWSCOR=0 301: DEATHS=0 302: MOVES=0 303: PLTIME=0 304: MUNGRM=0 305: HS=0 306: PRSA=0 307: C !CLEAR PARSE VECTOR. 308: PRSI=0 309: PRSO=0 310: PRSCON=1 311: OFLAG=0 312: C !CLEAR ORPHANS. 313: OACT=0 314: OSLOT=0 315: OPREP=0 316: ONAME=0 317: THFFLG=.FALSE. 318: C !THIEF NOT INTRODUCED BUT 319: THFACT=.TRUE. 320: C !IS ACTIVE. 321: SWDACT=.FALSE. 322: C !SWORD IS INACTIVE. 323: SWDSTA=0 324: C !SWORD IS OFF. 325: C 326: RECNO=1 327: C !INIT DB FILE POINTER. 328: MBASE=0 329: C !INIT MELEE BASE. 330: C LOGICAL UNIT NRS: 5=STDIN, 6=STDOUT 331: INPCH=5 332: C !TTY INPUT 333: OUTCH=6 334: DBCH=2 335: C !DATA BASE. 336: C INIT, PAGE 3 337: C 338: C INIT ALL ARRAYS. 339: C 340: DO 5 I=1,CMAX 341: C !CLEAR CLOCK EVENTS 342: CFLAG(I)=.FALSE. 343: CTICK(I)=0 344: CACTIO(I)=0 345: 5 CONTINUE 346: C 347: DO 10 I=1,FMAX 348: C !CLEAR FLAGS. 349: FLAGS(I)=.FALSE. 350: 10 CONTINUE 351: BUOYF=.TRUE. 352: C !SOME START AS TRUE. 353: EGYPTF=.TRUE. 354: CAGETF=.TRUE. 355: MR1F=.TRUE. 356: MR2F=.TRUE. 357: FOLLWF=.TRUE. 358: DO 12 I=1,SMAX 359: C !CLEAR SWITCHES. 360: SWITCH(I)=0 361: 12 CONTINUE 362: ORMTCH=4 363: C !NUMBER OF MATCHES. 364: LCELL=1 365: PNUMB=1 366: MDIR=270 367: MLOC=MRB 368: CPHERE=10 369: C 370: DO 15 I=1,R2MAX 371: C !CLEAR ROOM 2 ARRAY. 372: RROOM2(I)=0 373: OROOM2(I)=0 374: 15 CONTINUE 375: C 376: DO 20 I=1,XMAX 377: C !CLEAR TRAVEL ARRAY. 378: TRAVEL(I)=0 379: 20 CONTINUE 380: C 381: DO 30 I=1,VMAX 382: C !CLEAR VILLAINS ARRAYS. 383: VOPPS(I)=0 384: VPROB(I)=0 385: VILLNS(I)=0 386: VBEST(I)=0 387: VMELEE(I)=0 388: 30 CONTINUE 389: C 390: DO 40 I=1,OMAX 391: C !CLEAR OBJECT ARRAYS. 392: ODESC1(I)=0 393: ODESC2(I)=0 394: ODESCO(I)=0 395: OREAD(I)=0 396: OACTIO(I)=0 397: OFLAG1(I)=0 398: OFLAG2(I)=0 399: OFVAL(I)=0 400: OTVAL(I)=0 401: OSIZE(I)=0 402: OCAPAC(I)=0 403: OCAN(I)=0 404: OADV(I)=0 405: OROOM(I)=0 406: 40 CONTINUE 407: C 408: RDESC2=0 409: C !CLEAR DESC BASE PTR. 410: DO 50 I=1,RMAX 411: C !CLEAR ROOM ARRAYS. 412: RDESC1(I)=0 413: RACTIO(I)=0 414: RFLAG(I)=0 415: RVAL(I)=0 416: REXIT(I)=0 417: 50 CONTINUE 418: C 419: DO 60 I=1,MMAX 420: C !CLEAR MESSAGE DIRECTORY. 421: RTEXT(I)=0 422: 60 CONTINUE 423: C 424: DO 70 I=1,AMAX 425: C !CLEAR ADVENTURER'S ARRAYS. 426: AROOM(I)=0 427: ASCORE(I)=0 428: AVEHIC(I)=0 429: AOBJ(I)=0 430: AACTIO(I)=0 431: ASTREN(I)=0 432: AFLAG(I)=0 433: 70 CONTINUE 434: C 435: DBGFLG=0 436: PRSFLG=0 437: GDTFLG=0 438: C 439: C allow setting gdtflg true if user id matches wizard id 440: C this way, the wizard doesn't have to recompile to use gdt 441: C 442: if (getuid() .eq. WIZARDID) gdtflg=1 443: C 444: FROMDR=0 445: C !INIT SCOL GOODIES. 446: SCOLRM=0 447: SCOLAC=0 448: C INIT, PAGE 4 449: C 450: C NOW RESTORE FROM EXISTING INDEX FILE. 451: C 452: OPEN(UNIT=1,file=INDXFILE,status='OLD', 453: #ifdef XELOS 454: & FORM='FORMATTED',ACCESS='SEQUENTIAL',ERR=1900,recl=1) 455: #else 456: & FORM='FORMATTED',ACCESS='SEQUENTIAL',ERR=1900) 457: #endif 458: rewind(unit=1, err=1900) 459: READ(1,130) I,J,K 460: C !GET VERSION. 461: IF((I.NE.VMAJ).OR.(J.NE.VMIN)) 462: & GO TO 1925 463: 464: OPEN(UNIT=DBCH,file=TEXTFILE,status='OLD', 465: & FORM='UNFORMATTED',ACCESS='DIRECT', 466: & recl=76,ERR=1950) 467: rewind(unit=dbch, err=1950) 468: 469: #ifdef debug 470: PRINT 150 471: #ifdef NOCC 472: 150 FORMAT('RESTORING FROM "dindx.dat"') 473: #else NOCC 474: 150 FORMAT(' RESTORING FROM "dindx.dat"') 475: #endif NOCC 476: #endif debug 477: READ(1,130) MXSCOR,STRBIT,EGMXSC 478: READ(1,130) RLNT,RDESC2,RDESC1,REXIT,RACTIO,RVAL,RFLAG 479: READ(1,130) XLNT,TRAVEL 480: READ(1,130) OLNT,ODESC1,ODESC2,ODESCO,OACTIO,OFLAG1,OFLAG2, 481: & OFVAL,OTVAL,OSIZE,OCAPAC,OROOM,OADV,OCAN, 482: & OREAD 483: READ(1,130) R2LNT,OROOM2,RROOM2 484: READ(1,130) CLNT,CTICK,CACTIO 485: READ(1,135) CFLAG 486: READ(1,130) VLNT,VILLNS,VPROB,VOPPS,VBEST,VMELEE 487: READ(1,130) ALNT,AROOM,ASCORE,AVEHIC,AOBJ,AACTIO,ASTREN,AFLAG 488: READ(1,130) MBASE,MLNT,RTEXT 489: C 490: CLOSE(1) 491: GO TO 1025 492: C !INIT DONE. 493: C 494: C 130 FORMAT(I8) 495: 130 FORMAT(I6) 496: 135 FORMAT(L4) 497: C INIT, PAGE 5 498: C 499: C THE INTERNAL DATA BASE IS NOW ESTABLISHED. 500: C SET UP TO PLAY THE GAME. 501: C 502: 1025 CALL ITIME(SHOUR,SMIN,SSEC) 503: C !GET TIME AND DATE. 504: C CALL IDATE(I,J,K) 505: CALL IDATE(DATARR(1)) 506: CALL INIRND(or(DATARR(1),or(DATARR(2),DATARR(3))), 507: & or(SHOUR,or(SMIN,SSEC))) 508: C 509: WINNER=PLAYER 510: LASTIT=AOBJ(PLAYER) 511: HERE=AROOM(WINNER) 512: THFPOS=OROOM(THIEF) 513: BLOC=OROOM(BALLO) 514: INIT=.TRUE. 515: C 516: #ifdef debug 517: PRINT 1050,RLNT,RMAX,XLNT,XMAX,OLNT,OMAX,MLNT,MMAX, 518: & VLNT,VMAX,ALNT,AMAX,CLNT,CMAX,R2LNT,R2MAX 519: #ifdef NOCC 520: 1050 FORMAT('USED:'/I5,' OF',I5,' ROOMS'/ 521: & I5,' OF',I5,' EXITS'/ 522: & I5,' OF',I5,' OBJECTS'/ 523: & I5,' OF',I5,' MESSAGES'/ 524: & I5,' OF',I5,' VILLAINS'/ 525: & I5,' OF',I5,' ADVENTURERS'/ 526: & I5,' OF',I5,' CLOCK EVENTS'/ 527: & I5,' OF',I5,' ROOM2 SLOTS') 528: #else NOCC 529: 1050 FORMAT(' USED:'/1X,I5,' OF',I5,' ROOMS'/ 530: & 1X,I5,' OF',I5,' EXITS'/ 531: & 1X,I5,' OF',I5,' OBJECTS'/ 532: & 1X,I5,' OF',I5,' MESSAGES'/ 533: & 1X,I5,' OF',I5,' VILLAINS'/ 534: & 1X,I5,' OF',I5,' ADVENTURERS'/ 535: & 1X,I5,' OF',I5,' CLOCK EVENTS'/ 536: & 1X,I5,' OF',I5,' ROOM2 SLOTS') 537: #endif NOCC 538: PRINT 1150,MXSCOR,EGMXSC,RECNO,RDESC2,MBASE,STRBIT 539: #ifdef NOCC 540: 1150 FORMAT('MAX SCORE=',I5/'EG SCORE=',I5/ 541: & 'MAX RECNO=',I5/'RDESC2 BASE=',I5/ 542: & 'MELEE START=',I5/'STAR MASK=',I7) 543: #else NOCC 544: 1150 FORMAT(' MAX SCORE=',I5/' EG SCORE=',I5/ 545: & ' MAX RECNO=',I5/' RDESC2 BASE=',I5/ 546: & ' MELEE START=',I5/' STAR MASK=',I7) 547: #endif NOCC 548: PAUSE 1 549: #endif debug 550: C 551: RETURN 552: C INIT, PAGE 6 553: C 554: C ERRORS-- INIT FAILS. 555: C 556: 1900 PRINT 910 557: PRINT 980 558: RETURN 559: 1925 PRINT 920,I,J,K,VMAJ,VMIN,VEDIT 560: PRINT 980 561: RETURN 562: 1950 PRINT 960 563: PRINT 980 564: RETURN 565: #ifdef NOCC 566: 910 FORMAT('I can''t open ',INDXFILE,'.') 567: 920 FORMAT('"dindx.dat" is version ',I1,'.',I1,A1,'.'/ 568: & 'I require version ',I1,'.',I1,A1,'.') 569: 960 FORMAT('I can''t open ',TEXTFILE,'.') 570: 980 FORMAT('Suddenly a sinister, wraithlike figure appears before ' 571: & 'you,'/'seeming to float in the air. In a low, sorrowful voice' 572: & ' he says,'/'"Alas, the very nature of the world has changed, ' 573: & 'and the dungeon'/'cannot be found. All must now pass away."' 574: & ' Raising his oaken staff'/'in farewell, he fades into the ' 575: & 'spreading darkness. In his place'/'appears a tastefully ' 576: & 'lettered sign reading:'//23X,'INITIALIZATION FAILURE'// 577: & 'The darkness becomes all encompassing, and your vision fails.') 578: #else NOCC 579: 910 FORMAT(' I can''t open ',INDXFILE,'.') 580: 920 FORMAT(' "dindx.dat" is version ',I1,'.',I1,A1,'.'/ 581: & ' I require version ',I1,'.',I1,A1,'.') 582: 960 FORMAT(' I can''t open ',TEXTFILE,'.') 583: 980 FORMAT(' Suddenly a sinister, wraithlike figure appears before ' 584: & 'you,'/' seeming to float in the air. In a low, sorrowful voice' 585: & ' he says,'/' "Alas, the very nature of the world has changed, ' 586: & 'and the dungeon'/' cannot be found. All must now pass away."' 587: & ' Raising his oaken staff'/' in farewell, he fades into the ' 588: & 'spreading darkness. In his place'/' appears a tastefully ' 589: & 'lettered sign reading:'//23X,'INITIALIZATION FAILURE'// 590: & ' The darkness becomes all encompassing, and your vision fails.') 591: #endif NOCC 592: C 593: END 594: C PROTCT-- CHECK FOR USER VIOLATION 595: C 596: C THIS ROUTINE SHOULD BE MODIFIED IF YOU WISH TO ADD SYSTEM 597: C DEPENDANT PROTECTION AGAINST ABUSE. 598: C 599: C AT THE MOMENT, PLAY IS PERMITTED UNDER ALL CIRCUMSTANCES. 600: C 601: LOGICAL FUNCTION PROTCT(X) 602: IMPLICIT INTEGER(A-Z) 603: C 604: PROTCT=.TRUE. 605: RETURN 606: END 607: #endif PDP