4.4BSD/usr/src/contrib/dungeon/dinit.F

#include "files.h"

#ifndef INDXFILE
#define INDXFILE '/usr/games/lib/dunlib/dindx.dat'
#endif
#ifndef TEXTFILE
#define TEXTFILE '/usr/games/lib/dunlib/dtext.dat'
#endif
#ifndef WIZARDID
#define WIZARDID 0
#endif

C INIT-- DUNGEON INITIALIZATION SUBROUTINE
C
C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
C WRITTEN BY R. M. SUPNIK
C
C DECLARATIONS
C
	LOGICAL FUNCTION INIT(X)
	IMPLICIT INTEGER (A-Z)
#ifndef PDP
	LOGICAL PROTCT
	INTEGER DATARR(3)
#endif PDP
#include "parser.h"
#include "gamestate.h"
#include "state.h"
#include "screen.h"
#include "mindex.h"
C
C MISCELLANEOUS VARIABLES
C
	COMMON /STAR/ MBASE,STRBIT
	COMMON /VERS/ VMAJ,VMIN,VEDIT
	COMMON /TIME/ PLTIME,SHOUR,SMIN,SSEC
#include "io.h"
#include "debug.h"
	COMMON /HYPER/ HFACTR
#include "rooms.h"
#include "rflag.h"
#include "rindex.h"
#include "exits.h"
#include "curxt.h"
#include "xpars.h"
#include "objects.h"
#include "oindex.h"
#include "clock.h"
#include "villians.h"
#include "advers.h"
#include "flags.h"
C INIT, PAGE 2
C
#ifndef PDP
#ifdef SYSV
C make output unbuffered
	call unbuf
C
#endif
C FIRST CHECK FOR PROTECTION VIOLATION
C
	IF(PROTCT(X)) GO TO 10000
C						!PROTECTION VIOLATION?
	PRINT 10100
#ifdef NOCC
10100	FORMAT('There appears before you a threatening figure clad '
&	'all over'/'in heavy black armor.  His legs seem like the '
&	'massive trunk'/'of the oak tree.  His broad shoulders and '
&	'helmeted head loom'/'high over your own puny frame, and '
&	'you realize that his powerful'/'arms could easily crush the '
&	'very life from your body.  There'/'hangs from his belt a '
&	'veritable arsenal of deadly weapons:'/'sword, mace, ball '
&	'and chain, dagger, lance, and trident.'/'He speaks with a '
&	'commanding voice:'//20X,'"You shall not pass."'//'As '
&	'he grabs you by the neck all grows dim about you.')
#else NOCC
10100	FORMAT(' There appears before you a threatening figure clad '
&	'all over'/' in heavy black armor.  His legs seem like the '
&	'massive trunk'/' of the oak tree.  His broad shoulders and '
&	'helmeted head loom'/' high over your own puny frame, and '
&	'you realize that his powerful'/' arms could easily crush the '
&	'very life from your body.  There'/' hangs from his belt a '
&	'veritable arsenal of deadly weapons:'/' sword, mace, ball '
&	'and chain, dagger, lance, and trident.'/' He speaks with a '
&	'commanding voice:'//20X,'"You shall not pass."'//' As '
&	'he grabs you by the neck all grows dim about you.')
#endif NOCC
	CALL EXIT
#endif PDP
C
C NOW START INITIALIZATION PROPER
C
#ifdef PDP
C
C   Note: arrays FLAGS & SWITCH are initialized in the following
C           DATA statements, instead of using DO loops and assignments
C           as used before.  This saves some code space.
C
	DATA FLAGS/.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,
&		   .FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,
&		   .FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,
&		    .TRUE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.TRUE.,
&		   .FALSE.,.FALSE.,.FALSE.,.TRUE.,.FALSE.,.FALSE.,
&		   .FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,.FALSE.,
&		   .FALSE.,.FALSE.,.FALSE.,.TRUE.,.TRUE.,.FALSE.,
&		    .TRUE.,.FALSE.,.FALSE.,.FALSE./
C
	DATA SWITCH/0,0,0,0,0,0,0,0,0,
&		    4,0,270,0,0,0,0,0,
&		    1,1,0,0,10/
C
C   Note: SWITCH(13) or MLOC is initialized equal to MRB later.
C
C
	DATA LTSHFT/10/
	DATA EGSCOR/0/
	DATA EGMXSC/0/
	DATA MXLOAD/100/
	DATA RWSCOR/0/
	DATA DEATHS/0/
	DATA MOVES/0/
	DATA PLTIME/0/
	DATA MUNGRM/0/
	DATA HS/0/
	DATA PRSA/0/
	DATA PRSI/0/
	DATA PRSO/0/
	DATA PRSCON/1/
	DATA OFLAG/0/
	DATA OACT/0/
	DATA OSLOT/0/
	DATA OPREP/0/
	DATA ONAME/0/
	DATA THFFLG/.FALSE./
	DATA THFACT/.TRUE./
	DATA SWDACT/.FALSE./
	DATA SWDSTA/0/
C
	DATA RECNO/1/
	DATA MBASE/0/
	DATA INPCH/5/
	DATA OUTCH/5/
	DATA DBCH/2/
C
C INIT, PAGE 3
C
C
	DATA DBGFLG/0/
	DATA PRSFLG/0/
	DATA GDTFLG/0/
C
	FROMDR=0
	SCOLRM=0
	SCOLAC=0
	INIT=.FALSE.		
	MLOC=MRB
C
C INIT, PAGE 4
C
C NOW RESTORE FROM EXISTING INDEX FILE.
C
	call intrd(i)
	call intrd(j)
	call intrd(k)
	IF((I.NE.VMAJ).OR.(J.NE.VMIN))
&		GO TO 1925			
C
	call intrd(MXSCOR)
	call intrd(STRBIT)
	call intrd(EGMXSC)
C
	call intrd(RLNT)
	call intrd(RDESC2)
	call aryrd(200,RDESC1)
	call aryrd(200,REXIT)
	call aryrd(200,RACTIO)
	call aryrd(200,RVAL)
	call aryrd(200,RFLAG)
C
	call intrd(XLNT)
	call aryrd(900,TRAVEL)
	call intrd(OLNT)
	call aryrd(220,ODESC1)
	call aryrd(220,ODESC2)
	call aryrd(220,ODESCO)
	call aryrd(220,OACTIO)
	call aryrd(220,OFLAG1)
	call aryrd(220,OFLAG2)
	call aryrd(220,OFVAL)
	call aryrd(220,OTVAL)
	call aryrd(220,OSIZE)
	call aryrd(220,OCAPAC)
	call aryrd(220,OROOM)
	call aryrd(220,OADV)
	call aryrd(220,OCAN)
	call aryrd(220,OREAD)
C
	call intrd(R2LNT)
	call aryrd(20,OROOM2)
	call aryrd(20,RROOM2)
C
	call intrd(CLNT)
	call aryrd(25,CTICK)
	call aryrd(25,CACTIO)
C
	do 990 i=1,25
	cflag(i)=.TRUE.
	call logrd(j)
	if(j.EQ.0) CFLAG(i)=.FALSE.
990	continue
C
	call intrd(VLNT)
	call aryrd(4,VILLNS)
	call aryrd(4,VPROB)
	call aryrd(4,VOPPS)
	call aryrd(4,VBEST)
	call aryrd(4,VMELEE)
C
	call intrd(ALNT)
	call aryrd(4,AROOM)
	call aryrd(4,ASCORE)
	call aryrd(4,AVEHIC)
	call aryrd(4,AOBJ)
	call aryrd(4,AACTIO)
	call aryrd(4,ASTREN)
	call aryrd(4,AFLAG)
C
	call intrd(MBASE)
	call intrd(MLNT)
C
C   The RTEXT array is not used here, and isn't read (it's used
C   in "speak.F")
C
	call initnd
C
C INIT, PAGE 5
C
C THE INTERNAL DATA BASE IS NOW ESTABLISHED.
C SET UP TO PLAY THE GAME.
C
1025	CALL ITIME(SHOUR,SMIN,SSEC)		
	CALL INIRND(or(SHOUR,or(SMIN,SSEC)))
C
	WINNER=PLAYER
	LASTIT=AOBJ(PLAYER)
	HERE=AROOM(WINNER)
	THFPOS=OROOM(THIEF)
	BLOC=OROOM(BALLO)
	INIT=.TRUE.
#ifdef debug
C
C	Normally, PRSFLG is setable in gdt to allow seeing various
C	parse results.  Since the pdp version does not have gdt,
C	PRSFLG is set to show full debugging info when debug is enabled.
C
	PRSFLG=65535
#endif debug
C
C
	RETURN
C INIT, PAGE 6
C
C ERRORS-- INIT FAILS.
C
1925	continue
	END
#else PDP
10000	INIT=.FALSE.
C						!ASSUME INIT FAILS.
	MMAX=1050
C						!SET UP ARRAY LIMITS.
	OMAX=220
	RMAX=200
	VMAX=4
	AMAX=4
	CMAX=25
	FMAX=46
	SMAX=22
	XMAX=900
	R2MAX=20
	DIRMAX=15
C
	MLNT=0
C						!INIT ARRAY COUNTERS.
	OLNT=0
	RLNT=0
	VLNT=0
	ALNT=0
	CLNT=0
	XLNT=1
	R2LNT=0
C
	LTSHFT=10
C						!SET UP STATE VARIABLES.
	MXSCOR=LTSHFT
	EGSCOR=0
	EGMXSC=0
	MXLOAD=100
	RWSCOR=0
	DEATHS=0
	MOVES=0
	PLTIME=0
	MUNGRM=0
	HS=0
	PRSA=0
C						!CLEAR PARSE VECTOR.
	PRSI=0
	PRSO=0
	PRSCON=1
	OFLAG=0
C						!CLEAR ORPHANS.
	OACT=0
	OSLOT=0
	OPREP=0
	ONAME=0
	THFFLG=.FALSE.
C						!THIEF NOT INTRODUCED BUT
	THFACT=.TRUE.
C						!IS ACTIVE.
	SWDACT=.FALSE.
C						!SWORD IS INACTIVE.
	SWDSTA=0
C						!SWORD IS OFF.
C
	RECNO=1
C						!INIT DB FILE POINTER.
	MBASE=0
C						!INIT MELEE BASE.
C   LOGICAL UNIT NRS: 5=STDIN, 6=STDOUT
	INPCH=5
C						!TTY INPUT
	OUTCH=6
	DBCH=2
C						!DATA BASE.
C INIT, PAGE 3
C
C INIT ALL ARRAYS.
C
	DO 5 I=1,CMAX
C						!CLEAR CLOCK EVENTS
	  CFLAG(I)=.FALSE.
	  CTICK(I)=0
	  CACTIO(I)=0
5	CONTINUE
C
	DO 10 I=1,FMAX
C						!CLEAR FLAGS.
	  FLAGS(I)=.FALSE.
10	CONTINUE
	BUOYF=.TRUE.
C						!SOME START AS TRUE.
	EGYPTF=.TRUE.
	CAGETF=.TRUE.
	MR1F=.TRUE.
	MR2F=.TRUE.
	FOLLWF=.TRUE.
	DO 12 I=1,SMAX
C						!CLEAR SWITCHES.
	  SWITCH(I)=0
12	CONTINUE
	ORMTCH=4
C						!NUMBER OF MATCHES.
	LCELL=1
	PNUMB=1
	MDIR=270
	MLOC=MRB
	CPHERE=10
C
	DO 15 I=1,R2MAX
C						!CLEAR ROOM 2 ARRAY.
	  RROOM2(I)=0
	  OROOM2(I)=0
15	CONTINUE
C
	DO 20 I=1,XMAX
C						!CLEAR TRAVEL ARRAY.
	  TRAVEL(I)=0
20	CONTINUE
C
	DO 30 I=1,VMAX
C						!CLEAR VILLAINS ARRAYS.
	  VOPPS(I)=0
	  VPROB(I)=0
	  VILLNS(I)=0
	  VBEST(I)=0
	  VMELEE(I)=0
30	CONTINUE
C
	DO 40 I=1,OMAX
C						!CLEAR OBJECT ARRAYS.
	  ODESC1(I)=0
	  ODESC2(I)=0
	  ODESCO(I)=0
	  OREAD(I)=0
	  OACTIO(I)=0
	  OFLAG1(I)=0
	  OFLAG2(I)=0
	  OFVAL(I)=0
	  OTVAL(I)=0
	  OSIZE(I)=0
	  OCAPAC(I)=0
	  OCAN(I)=0
	  OADV(I)=0
	  OROOM(I)=0
40	CONTINUE
C
	RDESC2=0
C						!CLEAR DESC BASE PTR.
	DO 50 I=1,RMAX
C						!CLEAR ROOM ARRAYS.
	  RDESC1(I)=0
	  RACTIO(I)=0
	  RFLAG(I)=0
	  RVAL(I)=0
	  REXIT(I)=0
50	CONTINUE
C
	DO 60 I=1,MMAX
C						!CLEAR MESSAGE DIRECTORY.
	  RTEXT(I)=0
60	CONTINUE
C
	DO 70 I=1,AMAX
C						!CLEAR ADVENTURER'S ARRAYS.
	  AROOM(I)=0
	  ASCORE(I)=0
	  AVEHIC(I)=0
	  AOBJ(I)=0
	  AACTIO(I)=0
	  ASTREN(I)=0
	  AFLAG(I)=0
70	CONTINUE
C
	DBGFLG=0
	PRSFLG=0
	GDTFLG=0
C
C allow setting gdtflg true if user id matches wizard id
C this way, the wizard doesn't have to recompile to use gdt
C
	if (getuid() .eq. WIZARDID) gdtflg=1
C
	FROMDR=0
C						!INIT SCOL GOODIES.
	SCOLRM=0
	SCOLAC=0
C INIT, PAGE 4
C
C NOW RESTORE FROM EXISTING INDEX FILE.
C
	OPEN(UNIT=1,file=INDXFILE,status='OLD',
#ifdef XELOS
&		FORM='FORMATTED',ACCESS='SEQUENTIAL',ERR=1900,recl=1)
#else
&		FORM='FORMATTED',ACCESS='SEQUENTIAL',ERR=1900)
#endif
	rewind(unit=1, err=1900)
	READ(1,130) I,J,K
C						!GET VERSION.
	IF((I.NE.VMAJ).OR.(J.NE.VMIN))
&		GO TO 1925

	OPEN(UNIT=DBCH,file=TEXTFILE,status='OLD',
&		FORM='UNFORMATTED',ACCESS='DIRECT',
&		recl=76,ERR=1950)
	rewind(unit=dbch, err=1950)

#ifdef debug
	PRINT 150
#ifdef NOCC
150	FORMAT('RESTORING FROM "dindx.dat"')
#else NOCC
150	FORMAT(' RESTORING FROM "dindx.dat"')
#endif NOCC
#endif debug
	READ(1,130) MXSCOR,STRBIT,EGMXSC
	READ(1,130) RLNT,RDESC2,RDESC1,REXIT,RACTIO,RVAL,RFLAG
	READ(1,130) XLNT,TRAVEL
	READ(1,130) OLNT,ODESC1,ODESC2,ODESCO,OACTIO,OFLAG1,OFLAG2,
&		OFVAL,OTVAL,OSIZE,OCAPAC,OROOM,OADV,OCAN,
&		OREAD
	READ(1,130) R2LNT,OROOM2,RROOM2
	READ(1,130) CLNT,CTICK,CACTIO
	READ(1,135) CFLAG
	READ(1,130) VLNT,VILLNS,VPROB,VOPPS,VBEST,VMELEE
	READ(1,130) ALNT,AROOM,ASCORE,AVEHIC,AOBJ,AACTIO,ASTREN,AFLAG
	READ(1,130) MBASE,MLNT,RTEXT
C
	CLOSE(1)
	GO TO 1025
C						!INIT DONE.
C
C 130	FORMAT(I8)
130	FORMAT(I6)
135	FORMAT(L4)
C INIT, PAGE 5
C
C THE INTERNAL DATA BASE IS NOW ESTABLISHED.
C SET UP TO PLAY THE GAME.
C
1025	CALL ITIME(SHOUR,SMIN,SSEC)
C						!GET TIME AND DATE.
C	CALL IDATE(I,J,K)
	CALL IDATE(DATARR(1))
	CALL INIRND(or(DATARR(1),or(DATARR(2),DATARR(3))),
&		or(SHOUR,or(SMIN,SSEC)))
C
	WINNER=PLAYER
	LASTIT=AOBJ(PLAYER)
	HERE=AROOM(WINNER)
	THFPOS=OROOM(THIEF)
	BLOC=OROOM(BALLO)
	INIT=.TRUE.
C
#ifdef debug
	PRINT 1050,RLNT,RMAX,XLNT,XMAX,OLNT,OMAX,MLNT,MMAX,
&	  VLNT,VMAX,ALNT,AMAX,CLNT,CMAX,R2LNT,R2MAX
#ifdef NOCC
1050	FORMAT('USED:'/I5,' OF',I5,' ROOMS'/
&	  I5,' OF',I5,' EXITS'/
&	  I5,' OF',I5,' OBJECTS'/
&	  I5,' OF',I5,' MESSAGES'/
&	  I5,' OF',I5,' VILLAINS'/
&	  I5,' OF',I5,' ADVENTURERS'/
&	  I5,' OF',I5,' CLOCK EVENTS'/
&	  I5,' OF',I5,' ROOM2 SLOTS')
#else NOCC
1050	FORMAT(' USED:'/1X,I5,' OF',I5,' ROOMS'/
&	  1X,I5,' OF',I5,' EXITS'/
&	  1X,I5,' OF',I5,' OBJECTS'/
&	  1X,I5,' OF',I5,' MESSAGES'/
&	  1X,I5,' OF',I5,' VILLAINS'/
&	  1X,I5,' OF',I5,' ADVENTURERS'/
&	  1X,I5,' OF',I5,' CLOCK EVENTS'/
&	  1X,I5,' OF',I5,' ROOM2 SLOTS')
#endif NOCC
	PRINT 1150,MXSCOR,EGMXSC,RECNO,RDESC2,MBASE,STRBIT
#ifdef NOCC
1150	FORMAT('MAX SCORE=',I5/'EG SCORE=',I5/
&	  'MAX RECNO=',I5/'RDESC2 BASE=',I5/
&	  'MELEE START=',I5/'STAR MASK=',I7)
#else NOCC
1150	FORMAT(' MAX SCORE=',I5/' EG SCORE=',I5/
&	  ' MAX RECNO=',I5/' RDESC2 BASE=',I5/
&	  ' MELEE START=',I5/' STAR MASK=',I7)
#endif NOCC
	PAUSE 1
#endif debug
C
	RETURN
C INIT, PAGE 6
C
C ERRORS-- INIT FAILS.
C
1900	PRINT 910
	PRINT 980
	RETURN
1925	PRINT 920,I,J,K,VMAJ,VMIN,VEDIT
	PRINT 980
	RETURN
1950	PRINT 960
	PRINT 980
	RETURN
#ifdef NOCC
910	FORMAT('I can''t open ',INDXFILE,'.')
920	FORMAT('"dindx.dat" is version ',I1,'.',I1,A1,'.'/
&		'I require version ',I1,'.',I1,A1,'.')
960	FORMAT('I can''t open ',TEXTFILE,'.')
980	FORMAT('Suddenly a sinister, wraithlike figure appears before '
&	'you,'/'seeming to float in the air.  In a low, sorrowful voice'
&	' he says,'/'"Alas, the very nature of the world has changed, '
&	'and the dungeon'/'cannot be found.  All must now pass away."'
&	'  Raising his oaken staff'/'in farewell, he fades into the '
&	'spreading darkness.  In his place'/'appears a tastefully '
&	'lettered sign reading:'//23X,'INITIALIZATION FAILURE'//
&	'The darkness becomes all encompassing, and your vision fails.')
#else NOCC
910	FORMAT(' I can''t open ',INDXFILE,'.')
920	FORMAT(' "dindx.dat" is version ',I1,'.',I1,A1,'.'/
&		' I require version ',I1,'.',I1,A1,'.')
960	FORMAT(' I can''t open ',TEXTFILE,'.')
980	FORMAT(' Suddenly a sinister, wraithlike figure appears before '
&	'you,'/' seeming to float in the air.  In a low, sorrowful voice'
&	' he says,'/' "Alas, the very nature of the world has changed, '
&	'and the dungeon'/' cannot be found.  All must now pass away."'
&	'  Raising his oaken staff'/' in farewell, he fades into the '
&	'spreading darkness.  In his place'/' appears a tastefully '
&	'lettered sign reading:'//23X,'INITIALIZATION FAILURE'//
&	' The darkness becomes all encompassing, and your vision fails.')
#endif NOCC
C
	END
C PROTCT-- CHECK FOR USER VIOLATION
C
C THIS ROUTINE SHOULD BE MODIFIED IF YOU WISH TO ADD SYSTEM
C DEPENDANT PROTECTION AGAINST ABUSE.
C
C AT THE MOMENT, PLAY IS PERMITTED UNDER ALL CIRCUMSTANCES.
C
	LOGICAL FUNCTION PROTCT(X)
	IMPLICIT INTEGER(A-Z)
C
	PROTCT=.TRUE.
	RETURN
	END
#endif PDP