mirror of
https://github.com/PDP-10/its.git
synced 2026-03-25 01:47:08 +00:00
1760 lines
47 KiB
Groff
1760 lines
47 KiB
Groff
C THIS FILE HAS BEEN MODIFIED BY EJS@MIT-MC
|
||
C LAST UPDATE -- 4/18/79
|
||
|
||
IMPLICIT INTEGER(A-Z)
|
||
C
|
||
C SPACE--THE FINAL FRONTIER
|
||
C ----- --- ----- --------
|
||
C
|
||
C
|
||
C THESE ARE THE VOYAGES OF THE STARSHIP 'ENTERPRISE.'
|
||
C IT'S FIVE YEAR MISSION: TO EXPLORE STRANGE NEW WORLDS; TO SEEK
|
||
C OUT NEW LIFE AND NEW CIVILIZATIONS; TO BOLDLY GO WHERE NO MAN
|
||
C HAS GONE BEFORE.
|
||
C
|
||
C THIS IS 'STAR TREK'.
|
||
C
|
||
REAL RAN,XXX,R,FLOAT,WARP,X,Y,DAMAGE,COS,SIN,ALOG10,
|
||
$K5,YYY,SQRT,AMIN1,ATAN2,PIE,DELTAX,DELTAY,SIGN,AMAX1,
|
||
$ATAN,RATING,MINWRP,XWARP,YWARP,RESUSD,X2,X3,TEMP,TT
|
||
LOGICAL SAVRES,FILE
|
||
DIMENSION QDOL(6),GALAXY(14,14),QUADRT(8,8),DAMAGE(11),
|
||
$KLING1(9,2),LONG(3),KNOWN(14,14),CLOAK(8,8),DAMSTR(3,11),
|
||
$LDOL(64),KLING2(9),LINE(8),LOCATE(8,14,14),RANKS(3,12),
|
||
$HITVAL(9),CDOL(2),TDATE(2),FLAGSH(3)
|
||
COMMON DAMSTR
|
||
COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL,
|
||
$ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1,
|
||
$KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY,
|
||
$BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP,
|
||
$KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE,
|
||
$PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW,
|
||
$PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD,
|
||
$EUSED,PUSED,BUSED,FLAGSH
|
||
DATA BNAME,PIE,DOCKED/'-1 ',3.1415926,'DOCKE'/
|
||
DATA YES,NO/'Y ','N '/
|
||
DATA QDOL/'-','E','K','B','*','F'/
|
||
DATA DAMSTR/'WARP ','ENGIN','ES ','S.R. ','SENSO','RS ',
|
||
$'L.R. ','SENSO','RS ','PHASE','R CON','TROL ',
|
||
$'PHOTO','N TUB','ES ','DAMAG','E CON','TROL ',
|
||
$'DEFLE','CTORS',' ','COMMU','NICAT','IONS ',
|
||
$'TRANS','PORTE','R ','TRACT','OR BE','AMS ',
|
||
$'BATTL','E COM','PUTER'/
|
||
DATA LDOL/'G VIR','GO II','SOL I','II ','G DRA','CO IT',
|
||
$'RIGEL',' III ','DENEB',' VII ','ANTAR','ES II','CANOP',
|
||
$'US V ','CAPEL','LA VI','POLLU','X III','SPICA',' VIII',
|
||
$'VEGA ','VII ','ALTAI','R III','PROCY','ON I ','LALAN',
|
||
$'DE II','KRUGE','R IV ','SIRIU','S VII','HAMAL',' VII ',
|
||
$'POLAR','IS II','ALKAI','D II ','ACAMA','R VI ','AVIOR',
|
||
$' III ','CETUS',' VII ','NUNKI',' VII ','ANKAA',' III ',
|
||
$'MENKE','NT VI','DIPHD','A III','VALIO','TH VI','SUHAI',
|
||
$'L VI ','A SER','PEN I','G CAR','INA V','A AQU','ILA I',
|
||
$'CALLA','M 1X '/
|
||
DATA RANKS/'YEOMA','N ',' ',
|
||
$'ENSIG','N ',' ',
|
||
$'LIEUT','ENANT',', JG ',
|
||
$'LIEUT','ENANT',' ',
|
||
$'LT CO','MMAND','ER ',
|
||
$'COMMA','NDER ',' ',
|
||
$'CAPTA','IN ',' ',
|
||
$'COMMO','DORE ',' ',
|
||
$'REAR ','ADMIR','AL ',
|
||
$'VICE ','ADMIR','AL ',
|
||
$'ADMIR','AL ',' ',
|
||
$'FLEET',' ADMI','RAL '/
|
||
CC
|
||
NIN=5
|
||
NOUT=5
|
||
WRITE (NOUT,10)
|
||
10 FORMAT('0STREK VERSION DATED 18 APRIL 79. SEND BUGS TO EJS@MC'/)
|
||
CALL TIME(A,XXX)
|
||
XXX=XXX*(2.**5)
|
||
XXX=XXX/(2.**5)
|
||
CALL SETRAN(XXX)
|
||
RATING=500.
|
||
GAMES=0
|
||
WINS=0
|
||
FILE=.FALSE.
|
||
STAMOD=1
|
||
SHOMOD=0
|
||
LONMOD=1
|
||
TT=0
|
||
12 WRITE (NOUT,11)
|
||
11 FORMAT (' DO YOU WANT TO LOAD YOUR BATTLE RECORD?')
|
||
WRITE (NOUT, 15)
|
||
15 FORMAT (' USE CAPITAL LETTERS PLEASE. ',$)
|
||
READ (NIN,665,ERR=12) CCC
|
||
IF (CCC.EQ.YES) GO TO 1305
|
||
IF (CCC.NE.NO) GO TO 12
|
||
WRITE (NOUT,13)
|
||
13 FORMAT (' YOUR RATING IS 500 AND YOUR RANK IS ENSIGN.')
|
||
CC
|
||
C INITIALIZE A NEW GAME
|
||
C
|
||
85 IMESS=0
|
||
LSTCOM=-1
|
||
PRTY=0
|
||
DEFLCT=0
|
||
BOARD=0
|
||
EUSED=0
|
||
PUSED=0
|
||
BUSED=0
|
||
KLGMAX=200
|
||
STTORP=10
|
||
STENEG=3000
|
||
SHUSIG=0
|
||
BEGDAT=2000.*(1.+RAN(XXX))
|
||
CURDAT=BEGDAT
|
||
87 WRITE (NOUT,90)
|
||
90 FORMAT(' WHAT SIZE GALAXY DO YOU WISH TO DEFEND?(1 TO 14)',$)
|
||
READ (NIN,259,ERR=87) GALSIZ
|
||
WRITE (NOUT, 92)
|
||
92 FORMAT('0TO LIST COMMANDS, TYPE -1. DO NOT USE LETTERS.'//)
|
||
IF (GALSIZ.LT.1.OR.GALSIZ.GT.14) GO TO 87
|
||
DO 95 I=1,GALSIZ
|
||
DO 95 J=1,GALSIZ
|
||
95 KNOWN(I,J)=0
|
||
ENERGY=STENEG
|
||
TORPS=STTORP
|
||
PROBES=GALSIZ/2.
|
||
IF (2*PROBES.NE.GALSIZ) PROBES=PROBES+RAN(XXX)+.5
|
||
DO 104 I=1,11
|
||
104 DAMAGE(I)=0
|
||
QUADRW=GALSIZ*RAN(XXX)+1.
|
||
QUADCL=GALSIZ*RAN(XXX)+1.
|
||
CC
|
||
C SET UP GALAXY
|
||
C
|
||
FLAGSH(1)=0
|
||
FLAGSH(2)=0
|
||
FLAGSH(3)=1
|
||
TOTBAS=0
|
||
TOTENE=0
|
||
KQUADS=0
|
||
DO 121 I=1,GALSIZ
|
||
DO 121 J=1,GALSIZ
|
||
R=RAN(XXX)*64.
|
||
ENEMYS=XLTY(R,.08)+XLTY(R,.16)+XLTY(R,.26)+XLTY(R,.5)
|
||
ENEMYS=ENEMYS+XLTY(R,1.2)+XLTY(R,3.)+XLTY(R,7.)
|
||
ENEMYS=ENEMYS+XLTY(R,13.)+XLTY(R,25.)
|
||
IF (ENEMYS.NE.0) KQUADS=KQUADS+1
|
||
TOTENE=TOTENE+ENEMYS
|
||
BASES=0
|
||
IF (RAN(XXX).LE..96) GO TO 120
|
||
BASES=1
|
||
IF (RAN(XXX).GE..80) BASES=2
|
||
120 TOTBAS=TOTBAS+BASES
|
||
STARS=RAN(XXX)*9.+1.
|
||
121 GALAXY(I,J)=ENEMYS*100+BASES*10+STARS
|
||
IF (TOTENE.GT.0) GO TO 125
|
||
I=RAN(XXX)*GALSIZ+1.
|
||
J=RAN(XXX)*GALSIZ+1.
|
||
GALAXY(I,J)=GALAXY(I,J)+100
|
||
TOTENE=1
|
||
KQUADS=1
|
||
125 IF (TOTENE.LE.4) GO TO 127
|
||
K=RAN(XXX)*GALSIZ+1
|
||
L=RAN(XXX)*GALSIZ+1
|
||
126 DO 129 I=K,GALSIZ
|
||
DO 129 J=L,GALSIZ
|
||
IF (GALAXY(I,J)/100.EQ.0) GO TO 129
|
||
FLAGSH(1)=I
|
||
FLAGSH(2)=J
|
||
GO TO 127
|
||
129 CONTINUE
|
||
K=1
|
||
J=1
|
||
GO TO 126
|
||
127 STTOTE=TOTENE
|
||
IF (TOTBAS.GT.0) GO TO 128
|
||
I=RAN(XXX)*GALSIZ+1.
|
||
J=RAN(XXX)*GALSIZ+1.
|
||
GALAXY(I,J)=GALAXY(I,J)+10
|
||
TOTBAS=1
|
||
128 BOTTOM=KQUADS+TOTENE/2+GALSIZ*GALSIZ/KQUADS/2.
|
||
TOP=2*TOTENE
|
||
SPREAD=TOP-BOTTOM
|
||
SPREAD=SPREAD*(1.-ALOG10(FLOAT(GALSIZ))/3.)
|
||
AVADAT=10.*(SPREAD*RAN(XXX)+BOTTOM)
|
||
L=BEGDAT+AVADAT
|
||
CALL DATE(TDATE)
|
||
CALL TIME(TIMES)
|
||
WRITE (NOUT,130) TIMES,TDATE(1),TDATE(2)
|
||
130 FORMAT (' CURRENT TIME IS ',A5,' ON ',A5,A4)
|
||
IF (GAMES.EQ.0) GO TO 641
|
||
WRITE (NOUT,642) TOTENE,AVADAT
|
||
642 FORMAT (' YOUR MISSION: ',I3,' KLINGONS IN ',I4,' STARDATES.')
|
||
GO TO 643
|
||
641 WRITE (NOUT,640) CURDAT,TOTENE,AVADAT,L
|
||
640 FORMAT(' ORDERS: STARDATE = ',I4//
|
||
$' YOU ARE IN COMMAND OF THE UNITED STARSHIP ENTERPRISE.'/
|
||
$' YOUR MISSION IS TO RID THE GALAXY OF THE DEADLY'/
|
||
$' KLINGON MENACE. TO DO THIS, YOU MUST DESTROY THE'/
|
||
$' KLINGON INVASION FORCE OF ',I3,' BATTLE CRUISERS.'/
|
||
$' YOU HAVE ',I4,' STARDATES TO COMPLETE YOUR MISSION.'/
|
||
$' (I.E. UNTIL STARDATE ',I4,' ).'//)
|
||
CC
|
||
C SET UP EACH QUADRANT
|
||
C
|
||
C FIRST, FIND A PLACE TO PUT ALL THE KLINGONS
|
||
643 DO 830 I=1,GALSIZ
|
||
DO 830 J=1,GALSIZ
|
||
DO 710 R1=1,8
|
||
DO 710 R2=1,8
|
||
710 QUADRT(R1,R2)=0
|
||
L=GALAXY(I,J)
|
||
ENEMYS=L/100
|
||
L=L-100*ENEMYS
|
||
BASES=L/10
|
||
STARS=L-10*BASES
|
||
IF (ENEMYS.EQ.0) GO TO 740
|
||
DO 730 L=1,ENEMYS
|
||
720 R1=8.*RAN(XXX)+1.
|
||
R2=8.*RAN(XXX)+1.
|
||
IF (QUADRT(R1,R2).NE.0) GO TO 720
|
||
QUADRT(R1,R2)=2
|
||
730 IF (RAN(XXX).LT..3) QUADRT(R1,R2)=6
|
||
740 IF (BASES.EQ.0) GO TO 770
|
||
DO 760 L=1,BASES
|
||
750 R1=8.*RAN(XXX)+1.
|
||
R2=8.*RAN(XXX)+1.
|
||
IF (QUADRT(R1,R2).NE.0) GO TO 750
|
||
760 QUADRT(R1,R2)=3
|
||
770 IF (STARS.EQ.0) GO TO 800
|
||
DO 790 L=1,STARS
|
||
780 R1=8.*RAN(XXX)+1.
|
||
R2=8.*RAN(XXX)+1.
|
||
IF (QUADRT(R1,R2).NE.0) GO TO 780
|
||
790 QUADRT(R1,R2)=4
|
||
800 DO 820 R1=1,8
|
||
L=0
|
||
DO 810 R2=1,8
|
||
810 L=8*L+QUADRT(R1,R2)
|
||
820 LOCATE(R1,I,J)=L
|
||
830 CONTINUE
|
||
LQUADR=0
|
||
CC
|
||
C MOVE THE ENTERPRISE INTO A NEW QUADRANT
|
||
C
|
||
131 DO 900 I=1,9
|
||
KLING1(I,1)=0
|
||
KLING1(I,2)=0
|
||
900 KLING2(I)=0
|
||
L=0
|
||
DO 860 I=1,8
|
||
IF (LQUADR.EQ.0) GO TO 855
|
||
M=0
|
||
DO 850 J=1,8
|
||
850 M=8*M+QUADRT(I,J)
|
||
LOCATE(I,LQUADR,LQUADC)=M
|
||
855 M=LOCATE(I,QUADRW,QUADCL)
|
||
DO 860 J=1,8
|
||
R1=9-J
|
||
R2=M/8
|
||
QUADRT(I,R1)=M-8*R2
|
||
CLOAK(I,J)=1
|
||
IF (QUADRT(I,R1).NE.2.AND.QUADRT(I,R1).NE.6) GO TO 860
|
||
L=L+1
|
||
KLING1(L,1)=I
|
||
KLING1(L,2)=R1
|
||
KLING2(L)=KLGMAX
|
||
IF (QUADRT(I,R1).EQ.6) CLOAK(I,R1)=0
|
||
860 M=R2
|
||
M=GALAXY(QUADRW,QUADCL)
|
||
ENEMYS=M/100
|
||
M=M-100*ENEMYS
|
||
BASES=M/10
|
||
STARS=M-10*BASES
|
||
IF (L.EQ.ENEMYS) GO TO 870
|
||
865 WRITE (NOUT,950) L, ENEMYS,GALAXY(QUADRW,QUADCL),
|
||
$QUADRW,QUADCL,FLAGSH(1),FLAGSH(2),FLAGSH(3)
|
||
C SOME ENEMIES IN THIS QUADRANT HAVE DISAPPEARED
|
||
950 FORMAT(' PROGRAM ERROR 950. L = ',I3,' ENEMYS = ',I3
|
||
$/' GALAXY(QUADRW,QUADCL) = ',I4,' QUADRW = ',I3,
|
||
$' QUADCL = ',I3/' FLAGSH = ',I3,2X,I3,2X,I3)
|
||
GO TO 99999
|
||
870 SECTRW=8.*RAN(XXX)+1.
|
||
SECTCL=8.*RAN(XXX)+1.
|
||
IF (QUADRT(SECTRW,SECTCL).NE.0) GO TO 870
|
||
QUADRT(SECTRW,SECTCL)=1
|
||
IF (FLAGSH(1).NE.QUADRW.OR.FLAGSH(2).NE.QUADCL) GO TO 875
|
||
IF (ENEMYS.EQ.0) GO TO 865
|
||
FLAGSH(3)=RAN(XXX)*ENEMYS+1
|
||
KLING2(FLAGSH(3))=2*KLGMAX
|
||
875 CALL SB171(1)
|
||
LQUADR=QUADRW
|
||
LQUADC=QUADCL
|
||
162 COMAND=-1
|
||
PRTY=0
|
||
IF (ENEMYS.NE.0) CALL SB585
|
||
IF (ENERGY.LE.0) GO TO 619
|
||
161 SENFLG=1
|
||
IF (SHOMOD.EQ.0.AND.(SENFST.EQ.1.OR.LONMOD.EQ.1)) GO TO 163
|
||
IF (LONMOD.EQ.0) GO TO 363
|
||
IF (STAMOD.EQ.0) GO TO 220
|
||
GO TO 236
|
||
CC
|
||
C PERFORM SHORT RANGE SENSOR SCAN
|
||
C
|
||
163 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
KNOWN(QUADRW,QUADCL)=1
|
||
169 IF (DAMAGE(2).GE.0) GO TO 196
|
||
WRITE (NOUT,191)
|
||
191 FORMAT(' *** SHORT RANGE SENSORS ARE OUT ***')
|
||
IF (BOARD.EQ.0) GO TO 215
|
||
WRITE (NOUT,195) QUADRW,QUADCL
|
||
195 FORMAT(' SHUTTLECRAFT SHORT RANGE SENSOR SCAN FOR QUADRANT ',
|
||
$I2,',',I2/' ---------------')
|
||
GO TO 198
|
||
196 WRITE (NOUT,197) QUADRW, QUADCL
|
||
197 FORMAT (' SHORT RANGE SENSOR SCAN FOR QUADRANT ',I2,',',I2/
|
||
$' ---------------')
|
||
198 DO 217 I=1,8
|
||
DO 212 J=1,8
|
||
LINE(J)=6.*RAN(XXX)+1.
|
||
IF (DAMAGE(2).NE.0.AND.RAN(XXX).GE..98) GO TO 212
|
||
LINE(J)=QUADRT(I,J)+1
|
||
IF (LINE(J).EQ.6) LINE(J)=5
|
||
IF (LINE(J).EQ.7) LINE(J)=3
|
||
IF (FLAGSH(1).EQ.QUADRW.AND.FLAGSH(2).EQ.QUADCL.AND.
|
||
$KLING1(FLAGSH(3),1).EQ.I.AND.KLING1(FLAGSH(3),2).EQ.J) LINE(J)=6
|
||
LINE(J)=(LINE(J)-1)*CLOAK(I,J)+1
|
||
212 CONTINUE
|
||
WRITE (NOUT,211) (QDOL(LINE(J)),J=1,8)
|
||
211 FORMAT(1X,8(A1,1X))
|
||
217 CONTINUE
|
||
WRITE (NOUT,218)
|
||
218 FORMAT(' ---------------')
|
||
215 CONTINUE
|
||
IF (SENFLG.EQ.1.AND.LONMOD.EQ.0.AND.SENFST.EQ.1) GO TO 363
|
||
IF (STAMOD.EQ.0.AND.SENFLG.EQ.1) GO TO 222
|
||
GO TO 236
|
||
CC
|
||
C REPORT ON THE ENTERPRISE'S STATUS
|
||
C
|
||
220 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
IF (DAMAGE(11).EQ.0) GO TO 222
|
||
WRITE (NOUT,1410)
|
||
GO TO 236
|
||
222 WRITE (NOUT,221)CURDAT
|
||
221 FORMAT(' STARDATE ',I4)
|
||
WRITE (NOUT,223) CDOL
|
||
223 FORMAT(' CONDITION ',2A5)
|
||
WRITE (NOUT,225) QUADRW,QUADCL
|
||
225 FORMAT(' QUADRANT ',I2,',',I2)
|
||
WRITE (NOUT,227) SECTRW,SECTCL
|
||
227 FORMAT(' SECTOR ',I2,',',I1)
|
||
WRITE (NOUT,229) ENERGY
|
||
229 FORMAT(' ENERGY ',I4)
|
||
WRITE (NOUT,231) TORPS, PROBES
|
||
231 FORMAT(' PHOTON TORPEDOES ',I2,' /SCANNER PROBES ',I1)
|
||
L=AVADAT+BEGDAT-CURDAT
|
||
WRITE (NOUT,233) TOTENE,L
|
||
233 FORMAT(' KLINGONS LEFT ',I3,' /STARDATES LEFT ',I4)
|
||
IF (DEFLCT.GT.0) WRITE (NOUT,235) DEFLCT
|
||
235 FORMAT(' DEFLECTOR POWER ',I4)
|
||
GO TO 236
|
||
CC
|
||
C CHECK FOR PRIORITY DISTRESS SIGNALS
|
||
C
|
||
236 IF (RAN(XXX).LT..912445.OR.BOARD.NE.0.OR.BEGDAT+10.LT.CURDAT)
|
||
$ GO TO 237
|
||
WRITE (NOUT,167)
|
||
167 FORMAT(' SHUTTLECRAFT SIGNALS HAVE BEEN RECEIVED FROM THE ',
|
||
$'GALILEO')
|
||
SHUSIG=1
|
||
237 SENFLG=0
|
||
IF (PRTY.EQ.2) PRTY=1
|
||
IF (PRTY.NE.3.OR.RAN(XXX).GE..10) GO TO 164
|
||
WRITE (NOUT,165)
|
||
165 FORMAT('0PRIORITY DISTRESS SIGNAL CANCELED')
|
||
PRTY=0
|
||
164 IF (DAMAGE(1).NE.0) GO TO 257
|
||
IF (PRTY.EQ.1) GO TO 245
|
||
IF (TOTENE.EQ.ENEMYS.OR.RAN(XXX).LT..97) GO TO 257
|
||
239 PTYROW=GALSIZ*RAN(XXX)+1.
|
||
PTYCOL=GALSIZ*RAN(XXX)+1.
|
||
IF (GALAXY(PTYROW,PTYCOL).LT.100.OR.(PTYCOL.EQ.QUADCL.AND.
|
||
$PTYROW.EQ.QUADRW)) GO TO 239
|
||
I=GALAXY(PTYROW,PTYCOL)/100
|
||
PRTY=1
|
||
IF (I.GT.4) GO TO 241
|
||
PRTY=3
|
||
IF (I.EQ.1) GO TO 241
|
||
PRTY=(7-I)/2.+RAN(XXX)
|
||
IF (I.EQ.2.OR.I.EQ.4) GO TO 241
|
||
PRTY=3.*RAN(XXX)+1.
|
||
241 WRITE (NOUT,242) PRTY
|
||
242 FORMAT(' PRIORITY ',I1,' DISTRESS SIGNAL FROM '$)
|
||
R1=RAN(XXX)*32.+1.
|
||
R1=2*R1-1
|
||
WRITE (NOUT,243) LDOL(R1),LDOL(R1+1),PTYROW,PTYCOL
|
||
243 FORMAT('+',2A5,' IN QUADRANT ',I2,',',I2/)
|
||
IF (PRTY.NE.1) GO TO 257
|
||
245 DELTAY=QUADRW-PTYROW
|
||
DELTAX=PTYCOL-QUADCL
|
||
WARP=SQRT(DELTAY*DELTAY+DELTAX*DELTAX)
|
||
WRITE (NOUT,246)
|
||
246 FORMAT(' COURSE LAID AS:'/)
|
||
WRITE (NOUT,248) WARP
|
||
248 FORMAT(' WARP FACTOR: ',F4.1)
|
||
DELTAX=QUADRW-PTYROW
|
||
DELTAY=PTYCOL-QUADCL
|
||
COURSE=180.*ATAN2(DELTAY,DELTAX)/PIE+SIGN(.5,DELTAY)
|
||
IF (COURSE.LT.0) COURSE=COURSE+360
|
||
255 WRITE (NOUT,254) COURSE
|
||
254 FORMAT(' COURSE: ',I3)
|
||
GO TO 302
|
||
257 CONTINUE
|
||
CC
|
||
C COMMAND DISPATCHER
|
||
C
|
||
LSTCOM=COMAND
|
||
256 WRITE (NOUT,258)
|
||
258 FORMAT(' COMMAND?',$)
|
||
READ (NIN,259,ERR=265) COMAND
|
||
259 FORMAT(I)
|
||
IF (COMAND.LT.0) GO TO 263
|
||
IF (COMAND.GT.20) GO TO 265
|
||
261 FORMAT(' ACKNOWLEDGED')
|
||
L=COMAND+1
|
||
GO TO (282,163,363,384,420,482,497,509,530,541,544,561,
|
||
$564,902,1105,1205,1305,1405,220,619,3100),L
|
||
265 WRITE (NOUT,262)
|
||
262 FORMAT(' ILLEGAL COMMAND. (ENTER -1 FOR HELP)')
|
||
GO TO 256
|
||
263 WRITE (NOUT,264)
|
||
264 FORMAT(/' ::: COMMANDS :::'//
|
||
$' <0 = LIST THE COMMANDS(0)'/
|
||
$' 0 = ACTIVATE WARP ENGINES(2-12)*'/
|
||
$' 1 = PERFORM SHORT RANGE SENSOR SCAN(1)'/
|
||
$' 2 = PERFORM LONG RANGE SENSOR SCAN(1)'/
|
||
$' 3 = FIRE PHASERS(1)*'/
|
||
$' 4 = FIRE A PHOTON TORPEDO(1)*'/
|
||
$' 5 = OBTAIN DAMAGE CONTROL REPORT(1)'/
|
||
$' 6 = ACTIVATE DEFLECTORS(1)'/
|
||
$' 7 = OPEN COMMUNICATIONS(1)*'/
|
||
$' 8 = ENERGIZE TRANSPORTER(1)*')
|
||
WRITE (NOUT,3000)
|
||
3000 FORMAT(' 9 = DROP DEFLECTORS(1)*'/
|
||
$' 10 = ACTIVATE TRACTOR BEAMS(1)'/
|
||
$' 11 = FIRE TORPEDO SPREAD(1)*'/
|
||
$' 12 = OBTAIN COMPUTER GALAXY MAP(1)'/
|
||
$' 13 = RESET SENSOR MODES(0)'/
|
||
$' 14 = LAUNCH SUPER LONG RANGE SENSOR PROBE(1)'/
|
||
$' 15 = SAVE GAME(0)'/
|
||
$' 16 = RESTORE PREVIOUS GAME(0)'/
|
||
$' 17 = QUESTION THE BATTLE COMPUTER(1)'/
|
||
$' 18 = REPORT ENTERPRISE SITUATION(1)'/
|
||
$' 19 = SURRENDER!(0)'/
|
||
$' 20 = CANCEL PRIORITY 3 DISTRESS SIGNAL(1)'//
|
||
$' NUMBER IN PARENTHESES IS # OF STARDATES COMMAND USES.'/
|
||
$' AN * INDICATES KLINGONS MAY FIRE AFTER COMMAND USE.'/
|
||
$' -1 WITHIN A COMMAND WILL CANCEL IT.'/
|
||
$' COURSE FOR 0, 4, 11, AND 14 IS IN CLOCKWISE DEGREES'/
|
||
$' WITH 0 DEGREES BEING NORTH'/)
|
||
GO TO 236
|
||
C
|
||
C
|
||
C CANCEL PRIORITY 3 DISTRESS SIGNALS
|
||
C
|
||
3100 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
IF (PRTY.EQ.3) GO TO 3110
|
||
WRITE (NOUT,3105)
|
||
3105 FORMAT (' NO PRIORITY 3 DISTRESS SIGNAL ACTIVE.')
|
||
GO TO 236
|
||
3110 WRITE (NOUT,3115)
|
||
3115 FORMAT (' PRIORITY 3 DISTRESS SIGNAL CANCELED.')
|
||
PRTY=0
|
||
GO TO 236
|
||
CC
|
||
C ACTIVATE WARP ENGINES
|
||
C
|
||
282 PRTY=MIN0(1,PRTY)
|
||
IF (PRTY.GT.0) GO TO 245
|
||
IF (LSTCOM.EQ.17) GO TO 287
|
||
284 WRITE (NOUT,285)
|
||
285 FORMAT(' COURSE (0-359)?',$)
|
||
READ (NIN,259,ERR=284) ENGINE
|
||
IF (ENGINE.LT.0) GO TO 236
|
||
IF (ENGINE.GT.359) GO TO 284
|
||
289 WRITE (NOUT,290)
|
||
290 FORMAT(' WARP FACTOR (0.-20.)?',$)
|
||
READ (NIN,286,ERR=289) WARP
|
||
286 FORMAT(F)
|
||
IF (WARP.LE.0.) GO TO 236
|
||
287 IF (WARP.GT.20.) GO TO 284
|
||
IF (LSTCOM.EQ.17.AND.SHOMOD.EQ.1.AND.LONMOD.EQ.1)
|
||
$WRITE (NOUT,261)
|
||
IF (DAMAGE(1).EQ.0.OR.WARP.LT..31) GO TO 302
|
||
WRITE (NOUT,297)
|
||
297 FORMAT(' WARP ENGINES ARE DAMAGED. MAXIMUM SPEED = WARP .3')
|
||
GO TO 284
|
||
302 IF (ENEMYS.EQ.0) GO TO 305
|
||
CALL SB585
|
||
IF (ENERGY.LE.0) GO TO 619
|
||
305 DO 307 I=1,11
|
||
307 DAMAGE(I)=AMIN1(DAMAGE(I)+1.,0.)
|
||
N=WARP*8.
|
||
ENERGY=MIN0(STENEG,ENERGY-2*N)
|
||
CURDAT=CURDAT+2
|
||
IF (WARP.GE.1.) CURDAT=CURDAT+(WARP+1.)/2.
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
QUADRT(SECTRW,SECTCL)=0
|
||
IF (PRTY.EQ.1) GO TO 360
|
||
YYY=ENGINE*PIE/180.
|
||
DELTAX=SIN(YYY)
|
||
DELTAY=-COS(YYY)
|
||
X=SECTRW
|
||
Y=SECTCL
|
||
DO 353 I=1,N
|
||
X=X+DELTAY
|
||
Y=Y+DELTAX
|
||
L=X+.5
|
||
M=Y+.5
|
||
IF (L.LT.1.OR.L.GT.8.OR.M.LT.1.OR.M.GT.8) GO TO 358
|
||
IF (QUADRT(L,M).EQ.0) GO TO 353
|
||
WRITE (NOUT,349) L,M
|
||
349 FORMAT(' ENTERPRISE BLOCKED BY OBJECT AT SECTOR ',I1,',',I1)
|
||
X=X-DELTAY
|
||
Y=Y-DELTAX
|
||
GO TO 354
|
||
353 CONTINUE
|
||
354 SECTRW=X+.5
|
||
SECTCL=Y+.5
|
||
QUADRT(SECTRW,SECTCL)=1
|
||
CALL SB171(1)
|
||
IF (ENEMYS.NE.0) CALL SB585
|
||
IF (ENERGY.LE.0) GO TO 619
|
||
GO TO 161
|
||
358 IF (RAN(XXX).GT..03.OR.DAMAGE(1).LT.0.) GO TO 309
|
||
QUADRW=GALSIZ*RAN(XXX)+1.
|
||
QUADCL=GALSIZ*RAN(XXX)+1.
|
||
WRITE (NOUT,310) QUADRW,QUADCL
|
||
310 FORMAT(' *** SPACE WARP, ENTERPRISE THROWN OFF COURSE ***'/
|
||
$' NOW IN QUADRANT ',I2,',',I2)
|
||
QUADRT(SECTRW,SECTCL)=0
|
||
CURDAT=CURDAT+2+5*RAN(XXX)
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
GO TO 131
|
||
309 IF (RAN(XXX).GT..3) GO TO 330
|
||
R1=11.5*RAN(XXX)
|
||
IF (R1.EQ.0) R1=2
|
||
YYY=(AVADAT/10.)/STTOTE
|
||
YYY=ATAN(YYY)/1.8+.07
|
||
L=BEGDAT+AVADAT-CURDAT
|
||
IF (RAN(XXX).GT.YYY.OR.FLOAT(L)/AVADAT.LT..15) GO TO 318
|
||
YYY=AMIN1(RAN(XXX)*2.*L/(10.*TOTENE)+1.,6.)
|
||
DAMAGE(R1)=AMAX1(DAMAGE(R1)-YYY,-10.)
|
||
WRITE (NOUT,315)
|
||
315 FORMAT(' *** SPACE STORM, ',$)
|
||
WRITE (NOUT,316) (DAMSTR(I,R1),I=1,3)
|
||
316 FORMAT('+',3A5,' DAMAGED ***')
|
||
GO TO 335
|
||
318 CALL SB320
|
||
330 IF (RAN(XXX).GT..03) GO TO 335
|
||
L=BEGDAT+AVADAT-CURDAT
|
||
I=(L/4+2)*RAN(XXX)+1
|
||
IF (RAN(XXX).GT..6) I=-I
|
||
WRITE (NOUT,331) I
|
||
331 FORMAT (' *** TIME WARP OF ',I3,' STARDATES ***')
|
||
CURDAT=CURDAT+I
|
||
L=BEGDAT+AVADAT-CURDAT
|
||
WRITE (NOUT,333) L
|
||
333 FORMAT (1X,I3,' STARDATES NOW LEFT')
|
||
335 DEFLCT=0
|
||
TRNFLG=0
|
||
COMSIG=0
|
||
SHUSIG=0
|
||
R2=DELTAX*WARP*16.
|
||
R1=DELTAY*WARP*16.
|
||
L=QUADRW*16+SECTRW*2-1
|
||
M=QUADCL*16+SECTCL*2-1
|
||
L=MAX0(16,MIN0(16*GALSIZ+15,L+R1))
|
||
M=MAX0(16,MIN0(16*GALSIZ+15,M+R2))
|
||
QUADRW=L/16
|
||
QUADCL=M/16
|
||
GO TO 131
|
||
360 QUADRW=PTYROW
|
||
QUADCL=PTYCOL
|
||
GO TO 131
|
||
CC
|
||
C PERFORM LONG RANGE SENSOR SCAN
|
||
C
|
||
363 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
IF (DAMAGE(3).EQ.0.) GO TO 367
|
||
WRITE (NOUT,365)
|
||
365 FORMAT(' LONG RANGE SENSORS ARE INOPERABLE')
|
||
GO TO 383
|
||
367 WRITE (NOUT,366) QUADRW,QUADCL
|
||
366 FORMAT(' LONG RANGE SENSOR SCAN FOR QUADRANT ',I2,',',I2)
|
||
368 WRITE (NOUT,218)
|
||
IIL=QUADRW-1
|
||
IIH=QUADRW+1
|
||
JJL=QUADCL-1
|
||
JJH=QUADCL+1
|
||
DO 382 I=IIL,IIH
|
||
LONG(1)=0
|
||
LONG(2)=0
|
||
LONG(3)=0
|
||
IF (I.LT.1.OR.I.GT.GALSIZ) GO TO 378
|
||
DO 379 J=JJL,JJH
|
||
IF (J.LT.1.OR.J.GT.GALSIZ) GO TO 379
|
||
LONG(J-QUADCL+2)=GALAXY(I,J)
|
||
KNOWN(I,J)=1
|
||
379 CONTINUE
|
||
378 WRITE (NOUT,380) LONG
|
||
380 FORMAT(1X,I3,' : ',I3,' : ',I3)
|
||
WRITE (NOUT,218)
|
||
382 CONTINUE
|
||
383 IF (SENFLG.EQ.1.AND.SHOMOD.EQ.0.AND.SENFST.EQ.2) GO TO 163
|
||
IF (SENFLG.EQ.1.AND.STAMOD.EQ.0) GO TO 222
|
||
GO TO 236
|
||
CC
|
||
C FIRE PHASERS
|
||
C
|
||
384 IF (DAMAGE(4).EQ.0..AND.DAMAGE(11).EQ.0.) GO TO 388
|
||
CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
WRITE (NOUT,386)
|
||
386 FORMAT(' PHASERS ARE NOT OPERATIONAL')
|
||
GO TO 236
|
||
388 WRITE (NOUT,387)ENERGY
|
||
387 FORMAT(' PHASERS LOCKED ON TARGET(S). ENERGY AVAILABLE = ',
|
||
$I4)
|
||
IF (LSTCOM.EQ.17.AND.PFLAG.EQ.1) GO TO 392
|
||
391 WRITE (NOUT,389)
|
||
389 FORMAT(' NUMBER OF UNITS TO FIRE?',$)
|
||
READ (NIN,259,ERR=391) N
|
||
IF (N.LE.0) GO TO 236
|
||
392 LSTCOM=-1
|
||
IF (ENERGY.LE.N) GO TO 388
|
||
CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
IF (ENEMYS.EQ.0) GO TO 419
|
||
X=0.
|
||
DO 390 I=1,9
|
||
IF (KLING2(I).LE.0.OR.HITVAL(I).EQ.0) GO TO 390
|
||
DELTAX=KLING1(I,1)-SECTRW
|
||
DELTAY=SECTCL-KLING1(I,2)
|
||
X=X+SQRT(DELTAY*DELTAY+DELTAX*DELTAX)
|
||
390 CONTINUE
|
||
IF (X.EQ.0.) GO TO 419
|
||
IF (CDOL(1).NE.DOCKED) ENERGY=ENERGY-N
|
||
IF (CDOL(1).EQ.DOCKED) EUSED=EUSED+N
|
||
X=N/X
|
||
DO 416 I=1,9
|
||
IF (KLING2(I).LE.0.OR.HITVAL(I).EQ.0) GO TO 416
|
||
L=KLING1(I,1)
|
||
M=KLING1(I,2)
|
||
LOSS=X*(2.+RAN(XXX))
|
||
KLING2(I)=KLING2(I)-LOSS
|
||
WRITE (NOUT,407) LOSS
|
||
407 FORMAT(1X,I4,' UNIT HIT ON KLINGON AT SECTOR ',$)
|
||
IF (CLOAK(L,M).EQ.0) GO TO 411
|
||
WRITE (NOUT,409) L,M
|
||
409 FORMAT('+',I1,',',I1)
|
||
GO TO 412
|
||
411 WRITE (NOUT,410)
|
||
410 FORMAT('+UNKNOWN')
|
||
412 WRITE (NOUT,413) KLING2(I)
|
||
413 FORMAT(' (',I4,' LEFT)')
|
||
IF (KLING2(I).GT.0) GO TO 416
|
||
WRITE (NOUT,578) L,M
|
||
578 FORMAT(' KLINGON AT SECTOR ',I1,',',I1,' DESTROYED!')
|
||
ENEMYS=ENEMYS-1
|
||
TOTENE=TOTENE-1
|
||
QUADRT(L,M)=0
|
||
IF (FLAGSH(1).EQ.QUADRW.AND.FLAGSH(2).EQ.QUADCL.AND.
|
||
$KLING1(FLAGSH(3),1).EQ.L.AND.KLING1(FLAGSH(3),2).EQ.M)
|
||
$FLAGSH(1)=0
|
||
CLOAK(L,M)=1
|
||
CALL SB171(0)
|
||
416 CONTINUE
|
||
GALAXY(QUADRW,QUADCL)=ENEMYS*100+BASES*10+STARS
|
||
IF (TOTENE.EQ.0) GO TO 626
|
||
IF (ENEMYS.GT.0) CALL SB585
|
||
418 IF (ENERGY.LE.0) GO TO 619
|
||
GO TO 236
|
||
419 WRITE (NOUT,415)
|
||
415 FORMAT(' NO KLINGONS HIT')
|
||
GO TO 236
|
||
CC
|
||
C FIRE PHOTON TORPEDOES
|
||
C
|
||
420 IF (DAMAGE(5).EQ.0.) GO TO 424
|
||
CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
WRITE (NOUT,422)
|
||
422 FORMAT(' PHOTON TUBES ARE NOT OPERATIONAL')
|
||
GO TO 236
|
||
424 IF (TORPS.GT.0) GO TO 428
|
||
WRITE (NOUT,425)
|
||
425 FORMAT(' ALL PHOTON TORPEDOES EXPENDED')
|
||
IF (COMAND.EQ.11) GO TO 476
|
||
GO TO 236
|
||
428 IF (COMAND.EQ.11) GO TO 432
|
||
IF (LSTCOM.EQ.17.AND.TFLAG.EQ.1) GO TO 435
|
||
427 WRITE (NOUT,429)
|
||
429 FORMAT(' TORPEDO COURSE (0-359)?',$)
|
||
READ (NIN,259,ERR=427) COURSE
|
||
GO TO 435
|
||
432 COURSE=MOD(COURSE+45,360)
|
||
COUNT=COUNT+1
|
||
IF (COUNT.GT.MAXTRP) GO TO 476
|
||
WRITE (NOUT,434) COURSE
|
||
434 FORMAT(' COURSE: ',I3/)
|
||
435 IF (COURSE.LT.0) GO TO 236
|
||
IF (COURSE.GT.359) GO TO 427
|
||
IF (CDOL(1).NE.DOCKED) TORPS=TORPS-1
|
||
IF (CDOL(1).EQ.DOCKED) PUSED=PUSED+1
|
||
L=0
|
||
CALL TRACK(COURSE,1,N,L,M)
|
||
IF (N.EQ.0) GO TO 474
|
||
IF (N.NE.2.AND.N.NE.6) GO TO 460
|
||
WRITE (NOUT,451)
|
||
451 FORMAT(/' *** KLINGON DESTROYED ***')
|
||
ENEMYS=ENEMYS-1
|
||
TOTENE=TOTENE-1
|
||
IF (TOTENE.EQ.0) GO TO 626
|
||
DO 457 I=1,9
|
||
IF (L.EQ.KLING1(I,1).AND.M.EQ.KLING1(I,2)) GO TO 458
|
||
457 CONTINUE
|
||
WRITE (NOUT,456)
|
||
C NON-KLINGON KILLED. ??
|
||
456 FORMAT(/' PROGRAM ERROR 456.')
|
||
GO TO 865
|
||
458 KLING2(I)=0
|
||
CLOAK(L,M)=1
|
||
IF (FLAGSH(1).EQ.QUADRW.AND.FLAGSH(2).EQ.QUADCL.AND.
|
||
$FLAGSH(3).EQ.I) FLAGSH(1)=0
|
||
CALL SB171(0)
|
||
GO TO 471
|
||
460 IF (N.LT.4) GO TO 468
|
||
IF (N.EQ.4) GO TO 465
|
||
WRITE (NOUT,462)
|
||
462 FORMAT(/' STAR DESTROYED')
|
||
STARS=STARS-1
|
||
GO TO 471
|
||
465 WRITE (NOUT,466)
|
||
466 FORMAT(/' TORPEDO ABSORBED')
|
||
QUADRT(L,M)=5
|
||
GO TO 475
|
||
468 IF (N.EQ.3) GO TO 470
|
||
WRITE (NOUT,469)
|
||
469 FORMAT(/' PROGRAM ERROR 469')
|
||
GO TO 99999
|
||
470 WRITE (NOUT,467)
|
||
467 FORMAT(1X)
|
||
WRITE (NOUT,464)
|
||
464 FORMAT(/' *** STARBASE DESTROYED ... CONGRATULATIONS ***')
|
||
QUADRT(L,M)=0
|
||
CALL SB171(0)
|
||
BASES=BASES-1
|
||
471 QUADRT(L,M)=0
|
||
GALAXY(QUADRW,QUADCL)=ENEMYS*100+BASES*10+STARS
|
||
GO TO 475
|
||
474 WRITE (NOUT,473)
|
||
473 FORMAT(/' TORPEDO MISSED')
|
||
475 IF (COMAND.EQ.11) GO TO 420
|
||
476 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
IF (ENEMYS.NE.0) CALL SB585
|
||
IF (ENERGY.LE.0) GO TO 619
|
||
GO TO 236
|
||
CC
|
||
C OBTAIN DAMAGE CONTROL REPORT
|
||
C
|
||
482 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
IF (DAMAGE(6).EQ.0.) GO TO 486
|
||
WRITE (NOUT,484)
|
||
484 FORMAT(' DAMAGE CONTROL REPORT IS NOT AVAILABLE')
|
||
GO TO 236
|
||
486 WRITE (NOUT,487)
|
||
487 FORMAT(/' DAMAGED'/' DEVICE STATE OF REPAIR')
|
||
L=0
|
||
DO 492 I=1,11
|
||
IF (DAMAGE(I).EQ.0.) GO TO 492
|
||
WRITE (NOUT,491) (DAMSTR(J,I),J=1,3),DAMAGE(I)
|
||
491 FORMAT(1X,3A5,7X,F10.4)
|
||
L=1
|
||
492 CONTINUE
|
||
IF (L.EQ.1) GO TO 495
|
||
WRITE (NOUT,494)
|
||
494 FORMAT(' NONE')
|
||
495 WRITE (NOUT,467)
|
||
GO TO 236
|
||
CC
|
||
C ACTIVATE DEFLECTORS
|
||
C
|
||
497 IF (DEFLCT.LT.4000) GO TO 498
|
||
WRITE (NOUT,506)
|
||
506 FORMAT (' DEFLECTORS AT MAXIMUM STRENGTH')
|
||
504 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
GO TO 236
|
||
498 IF (DAMAGE(7).EQ.0.) GO TO 501
|
||
WRITE (NOUT,499)
|
||
499 FORMAT(' DEFLECTORS DAMAGED')
|
||
GO TO 504
|
||
501 IF (CDOL(1).EQ.DOCKED) GO TO 525
|
||
WRITE (NOUT,500) ENERGY
|
||
500 FORMAT(' ENERGY AVAILABLE = ',I4)
|
||
502 WRITE (NOUT,503)
|
||
503 FORMAT(' NUMBER OF UNITS TO DEFLECTORS?',$)
|
||
READ (NIN,259,ERR=502) S6
|
||
IF (S6.LT.0) GO TO 236
|
||
IF (DEFLCT+2*S6.LE.4000) GO TO 508
|
||
S6=(4000-DEFLCT)/2
|
||
WRITE (NOUT,507) S6
|
||
507 FORMAT (' MAXIMUM AMOUNT ',I4)
|
||
GO TO 502
|
||
508 IF (S6.GT.ENERGY) GO TO 501
|
||
CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
DEFLCT=DEFLCT+2*S6
|
||
ENERGY=ENERGY-S6
|
||
WRITE (NOUT,505) DEFLCT,ENERGY
|
||
505 FORMAT (' DEFLECTOR POWER NOW = ',I4,
|
||
$', ENERGY UNITS LEFT = ',I4)
|
||
GO TO 525
|
||
CC
|
||
C ATTEMPT COMMUNICATIONS
|
||
C
|
||
509 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
IF (DAMAGE(8).EQ.0.) GO TO 513
|
||
WRITE (NOUT,511)
|
||
511 FORMAT(' COMMUNICATIONS OUT')
|
||
GO TO 236
|
||
513 K4=0
|
||
K5=0
|
||
DO 518 I=1,9
|
||
IF (KLING2(I).LE.0) GO TO 518
|
||
K5=K5+KLING2(I)
|
||
K4=K4+1
|
||
518 CONTINUE
|
||
IF (K4.EQ.0) GO TO 521
|
||
IF (COMFLG.EQ.1) GO TO 520
|
||
IF (K5/K4.LT.100..AND..3.LT.RAN(XXX)) GO TO 527
|
||
520 I=RAN(XXX)*4.
|
||
WRITE (NOUT,3260)
|
||
IF (I.EQ.0) WRITE (NOUT,3270)
|
||
IF (I.EQ.1) WRITE (NOUT,3280)
|
||
IF (I.EQ.2) WRITE (NOUT,3290)
|
||
IF (I.EQ.3) WRITE (NOUT,3300)
|
||
GO TO 523
|
||
521 WRITE (NOUT,522)
|
||
522 FORMAT(' NO KLINGONS CAN HEAR YOU')
|
||
523 COMFLG=1
|
||
524 IF (ENEMYS.NE.0) CALL SB585
|
||
525 IF (ENERGY.LE.0) GO TO 619
|
||
GO TO 236
|
||
527 WRITE (NOUT,528)
|
||
528 FORMAT(' TRUCE ACCEPTED')
|
||
CALL SB320
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
GO TO 236
|
||
3260 FORMAT (' RESPONSE FROM KLINGON COMMANDER:')
|
||
3270 FORMAT (' NOT ON YOUR LIFE!')
|
||
3280 FORMAT (' A TRUCE?... NEVER!!!')
|
||
3290 FORMAT (' DO NOT INSULT THE KLINGON EMPIRE WITH ',
|
||
$'YOUR FAKE TRUCES!')
|
||
3300 FORMAT (' NO!, A KLINGON ALWAYS FIGHTS TO THE DEATH.')
|
||
CC
|
||
C TRANSPORT TORPEDOES FROM STARBASE
|
||
C
|
||
530 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
IF (DEFLCT.NE.0.OR.DAMAGE(2).NE.0..OR.DAMAGE(9).NE.0..OR.
|
||
$MOD(GALAXY(QUADRW,QUADCL),100).LT.10.OR.TORPS.GE.10) GO TO 532
|
||
IF (TRNFLG.EQ.0) GO TO 537
|
||
WRITE (NOUT,535)
|
||
535 FORMAT(' TRANSPORTER AVAILABLE ONLY ONCE PER',
|
||
$' STAY IN QUADRANT.')
|
||
GO TO 236
|
||
532 WRITE (NOUT,533)
|
||
533 FORMAT(' TRANSPORTATIONS FROM STARBASE IMPOSSIBLE BECAUSE')
|
||
IF (DEFLCT.NE.0) WRITE (NOUT,3210)
|
||
IF (DAMAGE(2).NE.0) WRITE (NOUT,3220)
|
||
IF (DAMAGE(9).NE.0) WRITE (NOUT,3230)
|
||
IF (MOD(GALAXY(QUADRW,QUADCL),100).LT.10) WRITE (NOUT,3240)
|
||
IF (TORPS.GE.10) WRITE (NOUT,3250)
|
||
GO TO 236
|
||
537 TORPS=TORPS+(10-TORPS)*RAN(XXX)+1
|
||
WRITE (NOUT,538) TORPS
|
||
538 FORMAT(' PHOTON TORPEDOES NOW NUMBER ',I2)
|
||
TRNFLG=1
|
||
GO TO 524
|
||
3210 FORMAT (' DEFLECTORS ARE UP')
|
||
3220 FORMAT (' S. R. SENSORS NOT OPERATIONAL')
|
||
3230 FORMAT (' TRANSPORTER IS OUT')
|
||
3240 FORMAT (' NO STARBASE IN QUADRANT')
|
||
3250 FORMAT (' # OF PHOTON TORPEDOES ALREADY 10')
|
||
CC
|
||
C DROP DEFLECTORS
|
||
C
|
||
541 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
WRITE (NOUT,261)
|
||
DEFLCT=DEFLCT/4
|
||
ENERGY=ENERGY+DEFLCT
|
||
WRITE (NOUT,542) DEFLCT,ENERGY
|
||
542 FORMAT (' GAIN OF ',I4,
|
||
$' ENERGY UNITS WHICH NOW TOTALS ',I4,' UNITS.')
|
||
DEFLCT=0
|
||
GO TO 524
|
||
CC
|
||
C ACTIVATE TRACTOR BEAMS
|
||
C
|
||
544 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
IF (DAMAGE(10).EQ.0.) GO TO 548
|
||
WRITE (NOUT,546)
|
||
546 FORMAT(' TRACTOR BEAMS DAMAGED')
|
||
GO TO 236
|
||
548 IF (SHUSIG.NE.0) GO TO 552
|
||
WRITE (NOUT,549)
|
||
549 FORMAT(' SHUTTLECRAFT SIGNALS HAVE NOT BEEN RECEIVED FROM THIS '
|
||
$/' QUADRANT THIS STARDATE.')
|
||
GO TO 236
|
||
552 LOSS=400.*RAN(X)
|
||
IF (LOSS.LT.ENERGY.AND.SHUSIG.NE.2) GO TO 555
|
||
WRITE (NOUT,554)
|
||
554 FORMAT(' ENERGY TOO LOW FOR TRACTOR BEAM USE')
|
||
SHUSIG=2
|
||
GO TO 236
|
||
555 IF (RAN(XXX).GE..2) GO TO 557
|
||
WRITE (NOUT,556)
|
||
556 FORMAT (' SHUTTLECRAFT GALILEO LOST DUE TO TRACTOR BEAM FAILURE.')
|
||
GO TO 236
|
||
557 IF (CDOL(1).EQ.DOCKED) EUSED=EUSED+LOSS
|
||
IF (CDOL(1).NE.DOCKED) ENERGY=ENERGY-LOSS
|
||
BOARD=1
|
||
WRITE (NOUT,559)
|
||
559 FORMAT(' SHUTTLECRAFT GALILEO SAFELY ABOARD THE ENTERPRISE')
|
||
GO TO 236
|
||
CC
|
||
C FIRE TORPEDO SPREAD
|
||
C
|
||
561 IF (LSTCOM.EQ.17.AND.SFLAG.EQ.1) GO TO 568
|
||
WRITE (NOUT,562)
|
||
562 FORMAT(' FIRST TORPEDO COURSE?(0-359)',$)
|
||
READ (NIN,259,ERR=561) ANGLE
|
||
IF (ANGLE.LT.0) GO TO 236
|
||
IF (ANGLE.GT.359) GO TO 561
|
||
563 WRITE (NOUT,560)
|
||
560 FORMAT(' HOW MANY TORPEDOES ARE TO BE FIRED?(1-8)',$)
|
||
READ (NIN,259,ERR=563) MAXTRP
|
||
IF (MAXTRP.LT.1) GO TO 236
|
||
IF (MAXTRP.GT.8) GO TO 563
|
||
568 COURSE=ANGLE-45
|
||
COUNT=0
|
||
GO TO 420
|
||
CC
|
||
C OBTAIN COMPUTER GALAXY MAP
|
||
C
|
||
564 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
IF (DAMAGE(11).EQ.0.) GO TO 567
|
||
WRITE (NOUT,1410)
|
||
GO TO 236
|
||
567 WRITE (NOUT,565)
|
||
565 FORMAT(/' KNOWN GALAXY APPEARS AS SHOWN:'/
|
||
$6X,'(ENTERPRISE INDICATED BY "*" AT RIGHT)'//)
|
||
DO 576 I=1,GALSIZ
|
||
DO 574 J=1,GALSIZ
|
||
L=KNOWN(I,J)*GALAXY(I,J)
|
||
IF (L.GE.0) GO TO 566
|
||
L=9*(GALAXY(I,J)/100)-GALAXY(I,J)/10
|
||
566 IF (QUADRW.EQ.I.AND.QUADCL.EQ.J) GO TO 572
|
||
IF (KNOWN(I,J).NE.0) GO TO 570
|
||
WRITE (NOUT,569)
|
||
569 FORMAT(' ...',2X,$)
|
||
GO TO 574
|
||
570 WRITE (NOUT,571) L
|
||
571 FORMAT(' ',I3,2X,$)
|
||
GO TO 574
|
||
572 WRITE (NOUT,573) L
|
||
573 FORMAT(' ',I3,'* ',$)
|
||
574 CONTINUE
|
||
WRITE (NOUT,575)
|
||
575 FORMAT(1X)
|
||
576 CONTINUE
|
||
GO TO 236
|
||
CC
|
||
C WIN
|
||
C
|
||
626 WINS=WINS+1
|
||
L=CURDAT-BEGDAT
|
||
X3=(CURDAT-BEGDAT-1)/1.5
|
||
WRITE (NOUT,627) CURDAT,STTOTE,L
|
||
627 FORMAT (' IT IS STARDATE ',I4,'.'/
|
||
$' THE LAST KLINGON BATTLE CRUISER HAS BEEN DESTROYED.'/
|
||
$' THE FEDERATION HAS BEEN SAVED.'/
|
||
$1X,I3,' KLINGONS IN ',I3,' STARDATES.')
|
||
GO TO 663
|
||
C
|
||
C LOSE
|
||
C
|
||
619 WRITE (NOUT,620) CURDAT, TOTENE
|
||
620 FORMAT(' IT IS STARDATE ',I4/
|
||
$' THE ENTERPRISE HAS BEEN DESTROYED -'/
|
||
$' THE FEDERATION WILL BE CONQUERED.'/
|
||
$' THERE ARE STILL ',I3,' KLINGON BATTLE CRUISERS.'/
|
||
$' YOU ARE DEAD.')
|
||
X3=STTOTE*(CURDAT-BEGDAT-1)/(STTOTE-TOTENE+1)
|
||
663 IF (X3.LT.0.5) X3=.5
|
||
GAMES=GAMES+1
|
||
X2=(STTOTE-TOTENE)*GALSIZ*1000./X3
|
||
TEMP=X2-1000.
|
||
IF (TEMP.GT.0.0) X2=X2/(SQRT(TEMP/1000.+1.))
|
||
IF (TEMP.LT.0.0) X2=X2*(SQRT(-TEMP/1000.+1.))
|
||
EUSED=EUSED+STENEG-ENERGY
|
||
PUSED=PUSED+STTORP-TORPS
|
||
WRITE (NOUT,600) EUSED,PUSED,BUSED
|
||
600 FORMAT (' YOU USED ',I5,' ENERGY UNITS, ',I2,
|
||
$' TORPEDOES, AND ',I2,' STOPS AT STARBASES.')
|
||
RESUSD=1.3/SQRT((EUSED+150.*PUSED+300.)/((STTOTE-
|
||
$TOTENE+1)*600.))
|
||
REUSED=REUSED/SQRT(SQRT((BUSED+1)*8./(STTOTE+10)))
|
||
RESUSD=RESUSD*(SQRT(GALSIZ/10.))
|
||
WRITE (NOUT,602) RESUSD,GALSIZ,GALSIZ
|
||
602 FORMAT (' RESOURCE UTILIZATION FACTOR ',F4.2,
|
||
$' IN A ',I2,' BY ',I2,' GALAXY.')
|
||
X=X2*RESUSD
|
||
WRITE (NOUT,645) X
|
||
645 FORMAT (' YOUR RATING FOR THIS BATTLE IS ',F6.1)
|
||
X=(8.5*RATING+1.5*X)/10.
|
||
IF (X.GE.2200) X=X-(X-2200.)/2.
|
||
WRITE (NOUT,644) X
|
||
644 FORMAT (' YOUR CUMULATIVE RATING IS ',F6.1)
|
||
I=X/100.
|
||
J=RATING/100.
|
||
RATING=X
|
||
IF (I.LT.5) I=4
|
||
IF (I.GE.10) I=I/2+5
|
||
I=I-3
|
||
IF (J.LT.5) J=4
|
||
IF (J.GE.10) J=J/2+5
|
||
J=J-3
|
||
IF (J.GT.12) J=12
|
||
IF (I.GT.12) I=12
|
||
IF (I.EQ.J) GO TO 675
|
||
IF (I.LT.J) WRITE (NOUT,671)
|
||
IF (I.GT.J) WRITE (NOUT,672)
|
||
671 FORMAT (' YOUR HAVE BEEN DEMOTED TO ',$)
|
||
672 FORMAT (' YOU HAVE BEEN PROMOTED TO ',$)
|
||
WRITE (NOUT,673) (RANKS(J,I), J=1,3)
|
||
673 FORMAT ('+',5A5)
|
||
675 DECODE (5,677,TIMES) HR1,MIN1
|
||
677 FORMAT (I2,1X,I2)
|
||
TT=TT-(HR1+MIN1/60.)
|
||
CALL TIME(TIMEF)
|
||
DECODE (5,677,TIMEF) HR2,MIN1
|
||
TT=TT+HR2+MIN1/60.
|
||
IF (HR2.LT.HR1) TT=TT+12.
|
||
WRITE (NOUT,678) TIMEF,TT
|
||
678 FORMAT (' IT IS NOW ',A5,'. YOU HAVE SPENT ',
|
||
$F4.2,' HOURS PLAYING STARTREK!')
|
||
WRITE (NOUT,664)
|
||
664 FORMAT(' DO YOU WANT TO PLAY AGAIN?(Y OR N)',$)
|
||
READ (NIN,665,ERR=675) CCC
|
||
665 FORMAT(A1)
|
||
IF (CCC.EQ.YES) GO TO 85
|
||
IF (CCC.NE.NO) GO TO 675
|
||
GALSIZ=0
|
||
IF (FILE) GO TO 1205
|
||
681 WRITE (NOUT,680)
|
||
680 FORMAT (' WOULD YOU LIKE TO SAVE YOUR BATTLE RECORD? ',$)
|
||
READ (NIN,665,ERR=681) CCC
|
||
IF (CCC.EQ.YES) GO TO 1205
|
||
IF (CCC.NE.NO) GO TO 681
|
||
669 WRITE (NOUT,670) WINS,GAMES
|
||
670 FORMAT (' YOU HAVE WON ',I3,' OUT OF ',I3,' BATTLES.'/)
|
||
STOP
|
||
9000 FORMAT (' STOP ON PROGRAM ERROR'/)
|
||
99999 WRITE (NOUT,9000)
|
||
STOP
|
||
CC
|
||
C RESET SENSOR MODES
|
||
C
|
||
902 WRITE (NOUT,905)
|
||
905 FORMAT(' SHORT RANGE MODE? (AUTOMATIC=0, MANUAL=1)',$)
|
||
READ (NIN,259,ERR=902) SHO2
|
||
IF (SHO2.LT.0) GO TO 236
|
||
SHOMOD=SHO2
|
||
IF (SHOMOD.NE.0.AND.SHOMOD.NE.1) GO TO 902
|
||
910 WRITE (NOUT,915)
|
||
915 FORMAT(' LONG RANGE MODE?',$)
|
||
READ (NIN,259,ERR=910) LONMOD
|
||
IF (LONMOD.NE.0.AND.LONMOD.NE.1) GO TO 910
|
||
917 WRITE (NOUT,918)
|
||
918 FORMAT (' STATUS REPORT?',$)
|
||
READ (NIN,259,ERR=917) STAMOD
|
||
IF (STAMOD.NE.0.AND.STAMOD.NE.1) GO TO 917
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
IF (SHOMOD.NE.0.OR.LONMOD.NE.0) GO TO 236
|
||
920 WRITE (NOUT,925)
|
||
925 FORMAT(' WHICH SENSOR FIRST? (SHORT=1, LONG=2)',$)
|
||
READ (NIN,259,ERR=920) SENFST
|
||
IF (SENFST.NE.1.AND.SENFST.NE.2) GO TO 920
|
||
GO TO 236
|
||
CC
|
||
C LAUNCH SUPER LONG RANGE SENSOR PROBE
|
||
C
|
||
1105 IF (PROBES.GT.0) GO TO 1115
|
||
CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
WRITE (NOUT,1110)
|
||
1110 FORMAT(' NO MORE PROBES')
|
||
GO TO 236
|
||
1115 IF (LSTCOM.EQ.17) GO TO 1123
|
||
WRITE (NOUT,1120)
|
||
1120 FORMAT(' PROBE COURSE (0-359)?',$)
|
||
READ (NIN,259,ERR=1115) ENGINE
|
||
IF (ENGINE.LT.0) GO TO 236
|
||
IF (ENGINE.GT.359) GO TO 1115
|
||
1123 CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
YYY=ENGINE*PIE/180.
|
||
DELTAX=SIN(YYY)/2.
|
||
DELTAY=-COS(YYY)/2.
|
||
X=QUADRW
|
||
Y=QUADCL
|
||
PROBES=PROBES-1
|
||
WRITE (NOUT,1125)
|
||
1125 FORMAT(' PROBE TRACK: ')
|
||
L=QUADRW
|
||
M=QUADCL
|
||
1130 X=X+DELTAY
|
||
Y=Y+DELTAX
|
||
IF (L.EQ.IFIX(X+.5).AND.M.EQ.IFIX(Y+.5)) GO TO 1130
|
||
L=X+.5
|
||
M=Y+.5
|
||
IF (L.LT.1.OR.L.GT.GALSIZ.OR.M.LT.1.OR.M.GT.GALSIZ) GO TO 1160
|
||
WRITE (NOUT,1135) L,M
|
||
1135 FORMAT(' QUADRANT ',I2,',',I2,2X,$)
|
||
I=GALAXY(L,M)
|
||
J=I/100
|
||
J=I/10-9*J
|
||
WRITE (NOUT,1140) J
|
||
1140 FORMAT('+',I2,' OBJECTS SIGHTED')
|
||
IF (KNOWN(L,M).EQ.0) KNOWN(L,M)=-1
|
||
GO TO 1130
|
||
1160 WRITE (NOUT,1165)
|
||
1165 FORMAT(' PROBE OUT OF RANGE')
|
||
GO TO 236
|
||
CC
|
||
C SAVE THE GAME
|
||
C
|
||
1205 IF (FILE) GO TO 1210
|
||
1206 WRITE (NOUT,1250)
|
||
1250 FORMAT(' FILE NAME? (1 TO 5 CHARACTERS) ',$)
|
||
READ (NIN,1260) NAME
|
||
1260 FORMAT(A5)
|
||
IF (NAME.EQ.BNAME) GO TO 236
|
||
FILE=.TRUE.
|
||
1210 IF (SAVRES(0,NAME)) GO TO 669
|
||
GO TO 669
|
||
C
|
||
C
|
||
C RESTORE AN OLD GAME
|
||
C
|
||
1305 IF (FILE) GO TO 1330
|
||
WRITE (NOUT,1250)
|
||
READ (NIN,1260) NAME
|
||
IF (NAME.EQ.BNAME) GO TO 236
|
||
IF (SAVRES(1,NAME)) GO TO 1320
|
||
WRITE (NOUT,1310)
|
||
1310 FORMAT (' I/O TROUBLE.')
|
||
GO TO 236
|
||
1320 FILE=.TRUE.
|
||
I=RATING/100.
|
||
IF (I.LT.5) I=4
|
||
IF (I.GE.10) I=I/2+5
|
||
I=I-3
|
||
IF (I.GT.12) I=12
|
||
WRITE (NOUT,1311) RATING,(RANKS(J,I),J=1,3)
|
||
1311 FORMAT (' YOUR INCOMING RATING IS ',F6.1/
|
||
$' YOUR RANK: ',5A5)
|
||
IF (GALSIZ.EQ.0) GO TO 85
|
||
CALL TIME(TIMES)
|
||
GO TO 222
|
||
C
|
||
1330 WRITE (NOUT,1335)
|
||
1335 FORMAT (' YOUR BATTLE RECORD IS ALREADY LOADED.')
|
||
GO TO 236
|
||
CC
|
||
C QUESTION THE BATTLE COMPUTER
|
||
C
|
||
1405 IF (DAMAGE(11).EQ.0.) GO TO 1415
|
||
CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
WRITE (NOUT,1410)
|
||
1410 FORMAT(' BATTLE COMPUTER IS NOT OPERATIONAL')
|
||
COMAND=-1
|
||
GO TO 236
|
||
1415 TFLAG=0
|
||
PFLAG=0
|
||
SFLAG=0
|
||
WRITE (NOUT,1420)
|
||
1420 FORMAT (' TARGET QUADRANT: ',$)
|
||
READ (NIN,1425,ERR=1415) R1,R2
|
||
1425 FORMAT(2I)
|
||
IF (R1.LT.0) GO TO 1480
|
||
CURDAT=CURDAT+1
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
IF (R1.GE.1.AND.R1.LE.14.AND.R2.GE.1.AND.R2.LE.14) GO TO 1441
|
||
1440 IF (DAMAGE(5).GE.0..AND.TORPS.NE.0) TFLAG=1
|
||
1431 WRITE (NOUT,1435)
|
||
1435 FORMAT('+TARGET SECTOR: ',$)
|
||
READ (NIN,1425,ERR=1431) R1,R2
|
||
IF (R1.LT.0) GO TO 1480
|
||
IF (R1.LT.1.OR.R1.GT.8.OR.R2.LT.1.OR.R2.GT.8) GO TO 1431
|
||
1437 DELTAX=SECTRW-R1
|
||
DELTAY=R2-SECTCL
|
||
COURSE=180.*ATAN2(DELTAY,DELTAX)/PIE+SIGN(.5,DELTAY)
|
||
IF (COURSE.LT.0) COURSE=COURSE+360
|
||
WARP=(SQRT(DELTAY*DELTAY+DELTAX*DELTAX)+(2-SQRT(2.)/2))/8.
|
||
L=R1
|
||
M=R2
|
||
CALL TRACK(COURSE,0,N,L,M)
|
||
IF ((L.NE.R1.OR.M.NE.R2).AND.DAMAGE(2).GE.0) GO TO 1426
|
||
WRITE (NOUT,1452) COURSE,WARP
|
||
1452 FORMAT ('+COURSE= ',I3,10X'WARP= ',F4.1/)
|
||
ENGINE=COURSE
|
||
1443 X=0.
|
||
V5=0
|
||
JJ=0
|
||
DO 1445 I=1,9
|
||
IF (KLING2(I).LE.0.OR.HITVAL(I).EQ.0) GO TO 1445
|
||
V5=MAX0(V5,KLING2(I))
|
||
DELTAY=KLING1(I,2)-SECTCL
|
||
DELTAX=SECTRW-KLING1(I,1)
|
||
X=X+SQRT(DELTAY*DELTAY+DELTAX*DELTAX)
|
||
JJ=JJ+1
|
||
1445 CONTINUE
|
||
IF (JJ.EQ.0.OR.DAMAGE(4).LT.0.) GO TO 1451
|
||
N=MAX0(5,IFIX(V5*X/2.5))
|
||
IF (ENERGY.LE.N) GO TO 1451
|
||
N=N+10
|
||
PFLAG=1
|
||
WRITE (NOUT,1450) N
|
||
1450 FORMAT('+AVERAGE ENERGY TO PHASERS = ',I5/)
|
||
1451 IF (DAMAGE(2).LT.0..OR.TORPS.EQ.0.OR.DAMAGE(5).LT.0.
|
||
$.OR.JJ.LT.2) GO TO 236
|
||
MAXKIL=0
|
||
MAXSTR=0
|
||
MAXTRP=0
|
||
FSTANG=0
|
||
DO 1455 I=1,9
|
||
IF (KLING2(I).LE.0.OR.HITVAL(I).EQ.0) GO TO 1455
|
||
DELTAX=SECTRW-KLING1(I,1)
|
||
DELTAY=KLING1(I,2)-SECTCL
|
||
CALL WIDTH(DELTAX,DELTAY,ANGMIN,ANGMAX)
|
||
DO 1467 ANG1=ANGMIN,ANGMAX
|
||
ANGLE=MOD(ANG1,360)
|
||
CALL CHECK(ANGLE,CNTKIL,KILTRP,STRKIL)
|
||
IF (CNTKIL.LT.MAXKIL) GO TO 1467
|
||
IF (CNTKIL.GT.MAXKIL) GO TO 1470
|
||
IF (KILTRP.GT.MAXTRP) GO TO 1467
|
||
IF (KILTRP.LT.MAXTRP) GO TO 1470
|
||
IF (STRKIL.LE.MAXSTR) GO TO 1467
|
||
1470 MAXKIL=CNTKIL
|
||
MAXSTR=STRKIL
|
||
MAXTRP=KILTRP
|
||
FSTANG=ANGLE
|
||
1490 CONTINUE
|
||
1467 CONTINUE
|
||
1455 CONTINUE
|
||
IF (MAXKIL.LT.2) GO TO 236
|
||
ANGLE=FSTANG
|
||
SFLAG=1
|
||
WRITE (NOUT,1475) MAXTRP, ANGLE, MAXKIL, MAXSTR
|
||
1475 FORMAT('+A SPREAD OF ',I1,' TORPEDOES FIRED AT ',I3,
|
||
$' DEGREES'/' WILL HIT ',I1,' KLINGONS AND ',I1,' STARS.'/)
|
||
IF (CURDAT.GT.BEGDAT+AVADAT) GO TO 619
|
||
GO TO 236
|
||
1480 COMAND=-1
|
||
GO TO 236
|
||
C
|
||
1441 FSTANG=-1
|
||
MINWRP=12.
|
||
DELTAY=R2-QUADCL+(4.-SECTCL)/8.
|
||
DELTAX=QUADRW-R1+(SECTRW-4.)/8.
|
||
IF (DELTAX.EQ.0..AND.DELTAY.EQ.0.) GO TO 1440
|
||
IF (DAMAGE(2).LT.0.) GO TO 1449
|
||
CALL WIDTH(DELTAX,DELTAY,ANGMIN,ANGMAX)
|
||
DELTAX=R2-QUADCL+(1.-2*SECTCL)/16.
|
||
DELTAY=R1-QUADRW+(1.-2*SECTRW)/16.
|
||
DO 1446 ANG1=ANGMIN,ANGMAX
|
||
COURSE=MOD(ANG1,360)
|
||
L=0
|
||
CALL TRACK(COURSE,0,N,L,M)
|
||
IF ((L.GE.1.AND.L.LE.8).AND.(M.GE.1.AND.M.LE.8)) GO TO 1446
|
||
YYY=COURSE*PIE/180.
|
||
X=SIN(YYY)
|
||
Y=-COS(YYY)
|
||
IF (X.NE.0.) GO TO 1460
|
||
IF (R2.NE.QUADCL) GO TO 1446
|
||
XWARP=0.
|
||
GO TO 1461
|
||
1460 XWARP=AMIN1(DELTAX/X,(DELTAX+15./16.)/X)
|
||
1461 IF (Y.NE.0.) GO TO 1462
|
||
IF (QUADRW.NE.R1) GO TO 1446
|
||
YWARP=0.
|
||
GO TO 1463
|
||
1462 YWARP=AMIN1(DELTAY/Y,(DELTAY+15./16.)/Y)
|
||
1463 WARP=AMAX1(XWARP,YWARP)
|
||
IF (.NOT.(((WARP*X.GE.DELTAX.AND.WARP*X.LT.(DELTAX+1))
|
||
$.OR.(WARP*X.GE.(DELTAX+1).AND.WARP*X.LT.DELTAX))
|
||
$.AND.((WARP*Y.GE.DELTAY.AND.WARP*Y.LT.(DELTAY+1))
|
||
$.OR.(WARP*Y.GE.(DELTAY+1).AND.WARP*Y.LT.DELTAY))))
|
||
$GO TO 1446
|
||
IF (WARP.GE.MINWRP) GO TO 1446
|
||
MINWRP=WARP
|
||
FSTANG=MOD(COURSE,360)
|
||
1446 CONTINUE
|
||
IF (FSTANG.GE.0) GO TO 1442
|
||
WRITE (NOUT,1448)
|
||
1448 FORMAT('+NO UNBLOCKED COURSE TO THAT QUADRANT')
|
||
GO TO 1480
|
||
1426 WRITE (NOUT,1427)
|
||
1427 FORMAT('+NO UNBLOCKED COURSE TO THAT SECTOR')
|
||
GO TO 1480
|
||
C
|
||
1449 FSTANG=180.*ATAN2(DELTAY,DELTAX)/PIE+SIGN(.5,DELTAY)
|
||
MINWRP=SQRT(DELTAX*DELTAX+DELTAY*DELTAY)
|
||
1442 WARP=MINWRP
|
||
ENGINE=FSTANG
|
||
WRITE (NOUT,1452) ENGINE, WARP
|
||
GO TO 236
|
||
END
|
||
CC
|
||
C COMPUTE DAMAGE DONE BY A KLINGON ATACK
|
||
C
|
||
SUBROUTINE SB585
|
||
IMPLICIT INTEGER(A-Z)
|
||
REAL SQRT,RAN,XXX,DAMAGE,FLOAT,ATAN2,PIE,SIGN,
|
||
$DELTAX,DELTAY,TT,RATING
|
||
DIMENSION GALAXY(14,14),QUADRT(8,8),DAMAGE(11),
|
||
$KLING1(9,2),KNOWN(14,14),CLOAK(8,8),
|
||
$KLING2(9),LOCATE(8,14,14),HITVAL(9),CDOL(2),
|
||
$MESSGE(4,3,3),DAMSTR(3,11),FLAGSH(3)
|
||
COMMON DAMSTR
|
||
COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL,
|
||
$ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1,
|
||
$KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY,
|
||
$BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP,
|
||
$KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE,
|
||
$PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW,
|
||
$PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD,
|
||
$EUSED,PUSED,BUSED,FLAGSH
|
||
DATA DOCKED/'DOCKE'/
|
||
DATA PIE/3.1415926/
|
||
DATA NIN,NOUT/5,5/
|
||
DATA MESSGE/'ENTER','PRISE',' WILL',' DIE.',
|
||
$'SURRE','NDER ','OR DI','E! ',
|
||
$'GOODB','YE EN','TERPR','ISE. ',
|
||
$'GOT Y','OU CO','RNERE','D. ',
|
||
$'HAVE ','YOU H','AD EN','OUGH?',
|
||
$'LAST ','CHANC','E!!!!',' ',
|
||
$'YOURE',' GOIN','G TO ','DIE! ',
|
||
$'SURRE','NDER!',' ',' ',
|
||
$'SWEET',' DREA','MS. ',' '/
|
||
EN=ENERGY
|
||
Q=1
|
||
IF (CDOL(1).NE.DOCKED) Q=0
|
||
VV5=0
|
||
DO 617 I=1,9
|
||
HITVAL(I)=0
|
||
IF (KLING2(I).LE.0) GO TO 617
|
||
DELTAX=SECTRW-KLING1(I,1)
|
||
DELTAY=KLING1(I,2)-SECTCL
|
||
COURSE=180.*ATAN2(DELTAY,DELTAX)/PIE+SIGN(.5,DELTAY)
|
||
IF (COURSE.LT.0) COURSE=COURSE+360
|
||
V5=1
|
||
L=0
|
||
CALL TRACK(COURSE,0,N,L,M)
|
||
IF (L.NE.KLING1(I,1).OR.M.NE.KLING1(I,2).OR.
|
||
$(N.NE.2.AND.N.NE.6)) V5=0
|
||
VV5=VV5+V5
|
||
LOSS=V5*KLING2(I)*(2.+RAN(XXX))/
|
||
$SQRT(FLOAT(L-SECTRW)**2+FLOAT(M-SECTCL)**2)
|
||
HITVAL(I)=V5
|
||
L=KLING1(I,1)
|
||
M=KLING1(I,2)
|
||
CLOAK(L,M)=CLOAK(L,M)*V5
|
||
IF (Q.EQ.1.OR.V5.EQ.0) GO TO 617
|
||
WRITE (NOUT,601) LOSS
|
||
601 FORMAT(1X,I4,
|
||
$' UNIT HIT ON ENTERPRISE FROM KLINGON AT SECTOR ',$)
|
||
IF (CLOAK(L,M).EQ.0) GO TO 605
|
||
WRITE (NOUT,604) L,M
|
||
604 FORMAT('+',I1,',',I1)
|
||
GO TO 608
|
||
605 WRITE (NOUT,607)
|
||
607 FORMAT('+UNKNOWN')
|
||
608 IF (DEFLCT.LE.0) GO TO 615
|
||
DEFLCT=DEFLCT-LOSS
|
||
IF (DEFLCT.LE.0) GO TO 618
|
||
WRITE (NOUT,610) DEFLCT
|
||
610 FORMAT(' POWER LEFT IN DEFLECTORS = ',I4)
|
||
GO TO 617
|
||
618 WRITE (NOUT,612)
|
||
612 FORMAT(' DEFLECTORS DESTROYED')
|
||
LOSS=500-DEFLCT
|
||
DEFLCT=0
|
||
DAMAGE(7)=-50.
|
||
615 ENERGY=ENERGY-LOSS
|
||
EUSED=EUSED-LOSS
|
||
WRITE (NOUT,616) ENERGY
|
||
616 FORMAT(' (',I4,' LEFT)')
|
||
617 CONTINUE
|
||
IF (RAN(XXX).GT..03) GO TO 2010
|
||
LOSS=300.*RAN(XXX)
|
||
WRITE (NOUT,2020) LOSS
|
||
2020 FORMAT(1X,I4,
|
||
$' UNIT HIT ON ENTERPRISE FROM KLINGON SPACE MINE')
|
||
IF (DEFLCT.LE.0) GO TO 2030
|
||
DEFLCT=DEFLCT-LOSS
|
||
WRITE (NOUT,610) DEFLCT
|
||
IF (DEFLCT.GE.0) GO TO 2010
|
||
WRITE (NOUT,612)
|
||
LOSS=500-DEFLCT
|
||
DEFLCT=0
|
||
DAMAGE(7)=-50.
|
||
2030 ENERGY=ENERGY-LOSS
|
||
EUSED=EUSED-LOSS
|
||
WRITE (NOUT,616) ENERGY
|
||
2010 IF (VV5.EQ.0) RETURN
|
||
IF (ENERGY.LE.100) GO TO 3025
|
||
IF (DAMAGE(4).LT.0) GO TO 3010
|
||
IF (ENERGY.GE.1000) GO TO 2040
|
||
3010 IF (DAMAGE(5).LT.0) GO TO 3020
|
||
IF (TORPS.GE.5) GO TO 2040
|
||
3020 IF (EN.EQ.ENERGY) GO TO 2040
|
||
3025 IF (Q.NE.0) GO TO 2040
|
||
IF (ENERGY.LE.0) GO TO 2040
|
||
IF (DAMAGE(1).LT.0.OR.DAMAGE(11).LT.0) GO TO 3030
|
||
IF (RAN(XXX).GE..6) GO TO 2050
|
||
3030 IMESS=IMESS+1
|
||
IF (IMESS.EQ.4) IMESS=3
|
||
TEMP=RAN(XXX)
|
||
K=1
|
||
IF (TEMP.GE..333) K=2
|
||
IF (TEMP.GE..666) K=3
|
||
WRITE (NOUT,2012)
|
||
2012 FORMAT(1X,' MESSAGE FROM KLINGON COMMANDER:')
|
||
WRITE (NOUT,2014) (MESSGE(J,IMESS,K),J=1,4)
|
||
2014 FORMAT (1X,4A5)
|
||
GO TO 2050
|
||
2040 IMESS=0
|
||
2050 IF (RAN(XXX).GT..07.OR.DEFLCT.GT.0.OR.Q.NE.0) GO TO 2060
|
||
IF (LOSS+LOSS*RAN(XXX).LT.100) GO TO 2060
|
||
R1=11.5*RAN(XXX)
|
||
L=(BEGDAT+AVADAT-CURDAT)*2
|
||
YYY=AMIN1(RAN(XXX)*L/(10.*TOTENE)+FLOAT(LOSS/300)+1.,6.)
|
||
DAMAGE(R1)=AMAX1(DAMAGE(R1)-YYY,-10.)
|
||
WRITE (NOUT,2055) (DAMSTR(I,R1),I=1,3)
|
||
2055 FORMAT (' *** ',3A5,' DAMAGED ***')
|
||
2060 IF (Q.EQ.0) RETURN
|
||
WRITE (NOUT,589)
|
||
589 FORMAT(' STARBASE SHIELDS PROTECT THE ENTERPRISE')
|
||
RETURN
|
||
END
|
||
CC
|
||
C DECLARE A TRUCE AND EFFECT REPAIRS
|
||
C
|
||
SUBROUTINE SB320
|
||
IMPLICIT INTEGER(A-Z)
|
||
REAL RAN,XXX,DAMAGE,AMIN1,TT,RATING
|
||
DIMENSION GALAXY(14,14),QUADRT(8,8),DAMAGE(11),
|
||
$KLING1(9,2),KNOWN(14,14),CLOAK(8,8),DAMSTR(3,11),
|
||
$KLING2(9),LOCATE(8,14,14),HITVAL(9),CDOL(2),
|
||
$FLAGSH(3)
|
||
COMMON DAMSTR
|
||
COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL,
|
||
$ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1,
|
||
$KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY,
|
||
$BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP,
|
||
$KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE,
|
||
$PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW,
|
||
$PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD,
|
||
$EUSED,PUSED,BUSED,FLAGSH
|
||
DATA NIN,NOUT/5,5/
|
||
DO 350 I=1,11
|
||
IF (DAMAGE(I).NE.0) GO TO 355
|
||
350 CONTINUE
|
||
GO TO 4500
|
||
355 WRITE (NOUT,320)
|
||
320 FORMAT(' *** EMERGENCY REPAIRS EFFECTED ***')
|
||
DO 323 I=1,11
|
||
IF (DAMAGE(I).EQ.0.) GO TO 323
|
||
DAMAGE(I)=AMIN1(DAMAGE(I)+RAN(XXX)*6.+1.,0.)
|
||
WRITE (NOUT,327) (DAMSTR(J,I),J=1,3)
|
||
327 FORMAT(1X,3A5,' STATE OF REPAIR IMPROVED ***')
|
||
323 CONTINUE
|
||
4500 DO 332 I=1,9
|
||
IF (KLING2(I).LE.0) GO TO 332
|
||
KLING2(I)=200
|
||
332 CONTINUE
|
||
IF (FLAGSH(1).NE.QUADRW.OR.FLAGSH(2).NE.QUADCL) RETURN
|
||
KLING2(FLAGSH(3))=400
|
||
RETURN
|
||
END
|
||
CC
|
||
C SET UP CONDITION OF ENTERPRISE
|
||
C
|
||
SUBROUTINE SB171(IFLAG)
|
||
IMPLICIT INTEGER(A-Z)
|
||
REAL RAN,XXX,DAMAGE,AMIN1,TT,RATING
|
||
DIMENSION GALAXY(14,14),QUADRT(8,8),DAMAGE(11),
|
||
$KLING1(9,2),KNOWN(14,14),CLOAK(8,8),
|
||
$KLING2(9),LOCATE(8,14,14),HITVAL(9),CDOL(2),GREEN(2),
|
||
$AMBER(2),RED(2),DOCKED(2),FLAGSH(3)
|
||
COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL,
|
||
$ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1,
|
||
$KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY,
|
||
$BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP,
|
||
$KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE,
|
||
$PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW,
|
||
$PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD,
|
||
$EUSED,PUSED,BUSED,FLAGSH
|
||
DATA DOCKED/'DOCKE','D'/
|
||
DATA GREEN/'GREEN',' '/
|
||
DATA AMBER/'AMBER',' '/
|
||
DATA RED/'RED',' '/
|
||
IIL=MAX0(SECTRW-1,1)
|
||
IIH=MIN0(SECTRW+1,8)
|
||
JJL=MAX0(SECTCL-1,1)
|
||
JJH=MIN0(SECTCL+1,8)
|
||
DO 179 I=IIL,IIH
|
||
DO 179 J=JJL,JJH
|
||
IF (QUADRT(I,J).NE.3) GO TO 179
|
||
CDOL(1)=DOCKED(1)
|
||
CDOL(2)=DOCKED(2)
|
||
EUSED=EUSED+STENEG-ENERGY
|
||
PUSED=PUSED+STTORP-TORPS
|
||
IF (COMAND.EQ.0) BUSED=BUSED+1
|
||
ENERGY=STENEG
|
||
TORPS=STTORP
|
||
IF (IFLAG.EQ.0) GO TO 187
|
||
DO 175 K=1,11
|
||
175 IF (DAMAGE(K).LT.0.) DAMAGE(K)=AMIN1(DAMAGE(K)+1.,0.)
|
||
GO TO 187
|
||
179 CONTINUE
|
||
IF (ENEMYS.GT.0) GO TO 184
|
||
IF (ENERGY.LT.IFIX(STENEG*.4)) GO TO 186
|
||
CDOL(1)=GREEN(1)
|
||
CDOL(2)=GREEN(2)
|
||
GO TO 187
|
||
184 CDOL(1)=RED(1)
|
||
CDOL(2)=RED(2)
|
||
GO TO 187
|
||
186 CDOL(1)=AMBER(1)
|
||
CDOL(2)=AMBER(2)
|
||
187 RETURN
|
||
END
|
||
C
|
||
C
|
||
C 0 IF X.GE.Y, 1 IF X.LT.Y
|
||
C
|
||
FUNCTION XLTY(X,Y)
|
||
INTEGER XLTY
|
||
REAL X,Y
|
||
XLTY=0
|
||
IF (X.LT.Y) XLTY=1
|
||
RETURN
|
||
END
|
||
C
|
||
C
|
||
C FIGURE MAXIMUM ACCEPTANCE ANGLE TO A SECTOR
|
||
C
|
||
SUBROUTINE WIDTH(DELTAX,DELTAY,ANGMIN,ANGMAX)
|
||
IMPLICIT INTEGER(A-Z)
|
||
REAL ATAN2,SIGN,PI,DELTAX,DELTAY,DELTA1,DELTA2,ROUND
|
||
DATA PI/3.1415926/
|
||
DELTA1=SIGN(.5,DELTAX)
|
||
DELTA2=SIGN(.5,DELTAY)
|
||
ANGMIN=ROUND(180.*ATAN2(DELTAY-DELTA1,DELTAX+DELTA2)/PI)
|
||
ANGMAX=ROUND(180.*ATAN2(DELTAY+DELTA1,DELTAX-DELTA2)/PI)
|
||
ANGMIN=MOD(ANGMIN,360)
|
||
ANGMAX=MOD(ANGMAX,360)
|
||
IF (ANGMAX.LT.ANGMIN) ANGMAX=ANGMAX+360
|
||
RETURN
|
||
END
|
||
C
|
||
C
|
||
C ROUND A REAL NUMBER
|
||
C
|
||
REAL FUNCTION ROUND(VAL)
|
||
ROUND=VAL+SIGN(.5,VAL)
|
||
RETURN
|
||
END
|
||
C
|
||
C
|
||
C DO A REAL "MOD"
|
||
C
|
||
INTEGER FUNCTION MOD(NUM,MDLS)
|
||
IMPLICIT INTEGER(A-Z)
|
||
MOD=NUM-(NUM/MDLS)*MDLS
|
||
IF (MOD.LT.0) MOD=MOD+MDLS
|
||
RETURN
|
||
END
|
||
C
|
||
C DO ALL THE WORK OF SAVING FILES
|
||
C
|
||
LOGICAL FUNCTION SAVRES(INOUT,NAME)
|
||
IMPLICIT INTEGER(A-Z)
|
||
REAL RAN,XXX,DAMAGE,AMIN1,TT,RATING
|
||
DIMENSION GALAXY(14,14),QUADRT(8,8),DAMAGE(11),
|
||
$KLING1(9,2),KNOWN(14,14),CLOAK(8,8),
|
||
$KLING2(9),LOCATE(8,14,14),HITVAL(9),CDOL(2),GREEN(2),
|
||
$AMBER(2),RED(2),DOCKED(2),FLAGSH(3)
|
||
COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL,
|
||
$ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1,
|
||
$KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY,
|
||
$BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP,
|
||
$KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE,
|
||
$PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW,
|
||
$PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD,
|
||
$EUSED,PUSED,BUSED,FLAGSH
|
||
SAVRES=.FALSE.
|
||
IF (INOUT.EQ.1) GO TO 100
|
||
CALL OFILE(21,NAME)
|
||
WRITE (21) CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL,
|
||
$ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1,
|
||
$KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY,
|
||
$BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP,
|
||
$KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE,
|
||
$PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW,
|
||
$PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD,
|
||
$EUSED,PUSED,BUSED,FLAGSH
|
||
ENDFILE 21
|
||
GO TO 999
|
||
100 CALL IFILE(21,NAME)
|
||
READ(21,ERR=1000) CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL,
|
||
$ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1,
|
||
$KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY,
|
||
$BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP,
|
||
$KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE,
|
||
$PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW,
|
||
$PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD,
|
||
$EUSED,PUSED,BUSED,FLAGSH
|
||
999 SAVRES=.TRUE.
|
||
1000 RETURN
|
||
END
|
||
CC
|
||
C TRACE OUT A PATH
|
||
C
|
||
SUBROUTINE TRACK(COURSE,IFLAG,N,JJ,KK)
|
||
IMPLICIT INTEGER(A-Z)
|
||
REAL FLOAT,X,Y,COS,SIN,YYY,SQRT,AMIN1,ATAN2,PIE,
|
||
$DELTAX,DELTAY,TT,RATING
|
||
DIMENSION GALAXY(14,14),QUADRT(8,8),DAMAGE(11),
|
||
$KLING1(9,2),KNOWN(14,14),CLOAK(8,8),KLING2(9),
|
||
$LOCATE(8,14,14),HITVAL(9),CDOL(2),FLAGSH(3)
|
||
COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL,
|
||
$ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1,
|
||
$KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY,
|
||
$BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP,
|
||
$KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE,
|
||
$PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW,
|
||
$PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD,
|
||
$EUSED,PUSED,BUSED,FLAGSH
|
||
DATA PIE/3.1415926/
|
||
DATA NIN,NOUT/5,5/
|
||
N=0
|
||
YYY=COURSE*PIE/180.
|
||
DELTAX=SIN(YYY)/2.
|
||
DELTAY=-COS(YYY)/2.
|
||
X=SECTRW
|
||
Y=SECTCL
|
||
IF (IFLAG.EQ.1) WRITE (NOUT,442)
|
||
442 FORMAT(' TORPEDO TRACK: ',$)
|
||
L=SECTRW
|
||
M=SECTCL
|
||
443 X=X+DELTAY
|
||
Y=Y+DELTAX
|
||
IF (L.EQ.IFIX(X+.5).AND.M.EQ.IFIX(Y+.5)) GO TO 443
|
||
L=X+.5
|
||
M=Y+.5
|
||
IF (L.LT.1.OR.L.GT.8.OR.M.LT.1.OR.M.GT.8) GO TO 474
|
||
IF (IFLAG.EQ.1) WRITE (NOUT,446) L,M
|
||
446 FORMAT('+',I1,',',I1,2X,$)
|
||
N=QUADRT(L,M)
|
||
IF (L.EQ.JJ.AND.M.EQ.KK) GO TO 474
|
||
IF (N.EQ.0) GO TO 443
|
||
JJ=L
|
||
KK=M
|
||
474 RETURN
|
||
END
|
||
CC
|
||
C SEE WHAT DAMAGE A SPRAY OF TORPS CAN DO
|
||
C
|
||
SUBROUTINE CHECK(ANGLE,CNTKIL,KILTRP,STRKIL)
|
||
IMPLICIT INTEGER(A-Z)
|
||
REAL RAN,XXX,DAMAGE,AMIN1,TT,RATING
|
||
DIMENSION GALAXY(14,14),QUADRT(8,8),DAMAGE(11),KLING1(9,2),
|
||
$KNOWN(14,14),CLOAK(8,8),KLING2(9),LOCATE(8,14,14),
|
||
$HITVAL(9),CDOL(2),FLAGSH(3)
|
||
COMMON/VARIAB/CDOL,XXX,QUADRW,QUADCL,SECTRW,SECTCL,
|
||
$ENERGY,STENEG,TORPS,ENEMYS,DEFLCT,DAMAGE,SHOMOD,KLING1,
|
||
$KLING2,QUADRT,CLOAK,GALAXY,GALSIZ,LONMOD,PRTY,
|
||
$BOARD,SHUSIG,BEGDAT,CURDAT,KNOWN,STTORP,
|
||
$KLGMAX,TOTBAS,TOTENE,BASES,STARS,STTOTE,AVADAT,LOCATE,
|
||
$PROBES,SENFST,SENFLG,TRNFLG,COMFLG,HITVAL,PTYROW,
|
||
$PTYCOL,LQUADR,LQUADC,GAMES,WINS,RATING,TT,IMESS,STAMOD,
|
||
$EUSED,PUSED,BUSED,FLAGSH
|
||
DATA NIN,NOUT/5,5/
|
||
CNTKIL=0
|
||
CNTSTR=0
|
||
C KILTRP IS A COUNT OF THE NUMBER OF TORPEDOES REQUIRED TO KILL
|
||
C CNTKIL KLINGONS.
|
||
KILTRP=0
|
||
C STRKIL COUNTS THE NUMBER OF STARS THAT WILL BE HIT BY KILTRP
|
||
C TORPEDOES.
|
||
STRKIL=0
|
||
C KILTRP=CNTKIL+STRKIL+MISSES
|
||
DO 60 J=1,8
|
||
IF (TORPS.LT.J) GO TO 59
|
||
K=MOD(ANGLE+45*(J-1),360)
|
||
IF (J.EQ.1) GO TO 65
|
||
LL=0
|
||
CALL TRACK(K,0,II,LL,MM)
|
||
IF (LL.EQ.L.AND.MM.EQ.M) GO TO 60
|
||
L=LL
|
||
M=MM
|
||
MM=II
|
||
GO TO 66
|
||
C
|
||
65 L=0
|
||
CALL TRACK(K,0,MM,L,M)
|
||
IF (MM.LE.0.AND.J.EQ.1) GO TO 59
|
||
66 IF (MM.LE.0) GO TO 60
|
||
IF (MM.EQ.2) GO TO 53
|
||
IF (MM.EQ.3) GO TO 59
|
||
IF (MM.GE.4) GO TO 56
|
||
WRITE (NOUT,57)MM
|
||
57 FORMAT(' PROGRAM ERROR 57. MM = ',I2//)
|
||
STOP
|
||
56 IF (MM.NE.6) CNTSTR=CNTSTR+1
|
||
GO TO 60
|
||
53 IF (J.NE.8) GO TO 54
|
||
LL=0
|
||
CALL TRACK(ANGLE,0,II,LL,MM)
|
||
IF (LL.EQ.L.AND.MM.EQ.M) GO TO 60
|
||
54 CNTKIL=CNTKIL+1
|
||
KILTRP=J
|
||
STRKIL=CNTSTR
|
||
60 CONTINUE
|
||
59 RETURN
|
||
END
|
||
C |