Path: uunet!cs.utexas.edu!swrinde!zaphod.mps.ohio-state.edu!howland.reston.ans.net!usc!elroy.jpl.nasa.gov!decwrl!concert!lester.appstate.edu!pembvax1.pembroke.edu!rennie From: rennie@pembvax1.pembroke.edu Newsgroups: vmsnet.sources.games Subject: Star Trek - Part [12/18] Date: 7 Apr 93 10:58:49 EDT Organization: Pembroke State University Lines: 433 Message-ID: <1993Apr7.105849.1@pembvax1.pembroke.edu> NNTP-Posting-Host: papa.pembroke.edu Xref: uunet vmsnet.sources.games:654 -+-+-+-+-+-+-+-+ START OF PART 12 -+-+-+-+-+-+-+-+ X`09IF(IPOOP.EQ.0.OR.NENHERE.EQ.0)GO TO 15 X`09CALL PROUT ('PHASERS NOT USABLE; BATTLE COMPUTER DATA FOLLOWS:',49) X`09GO TO 870 X15`09IDIDIT=0 X`09IF(IFAST.NE.0) ENERGY=ENERGY+200.0 X`09RETURN X 16 ENERGY=ENERGY-200. X IFAST = 1`20 XC--------READ IN AMOUNT OF ENERGY TO EXPEND ON PHASER FIRE X 20 CALL SCAN X`09POW=FNUM X IF(NENHERE .EQ. 0) GO TO 35`20 X K=1`20 X IF(KEY.EQ.IHALPHA) GOTO 23 `20 X`09IF(KEY.EQ.IHREAL) GOTO 28 X IF(.NOT.CROP(AITEM,2HNO)) GOTO 23`20 X`09NO=1 X`09CALL SCAN X`09POW=FNUM X 23 IF(KEY .EQ. IHALPHA .AND.CROP(AITEM,6HMANUAL))GO TO 90 X IF(DAMAGE(11).NE.0)GO TO 80`20 X IF(DAMAGE(1).NE.0) GO TO 81`20 XC------- IS KEY EOL,AUTO OR PHAS POWER?`20 X IF(KEY .NE. IHALPHA)GO TO 2301 X IF(CROP(AITEM,9HAUTOMATIC))GO TO 27`20 X GO TO 24 XC-------- DIFFERENTIATE BETWEEN EOL AND PHASER POWER(COMMAND MODE) X 2301 IF(KEY .NE. IHEOL)GO TO 30 XC------ REQUEST MANUAL OR AUTO X 24 CALL MANORA`20 X CALL SCAN`20 X`09IF(FNUM.EQ.-1.) GO TO 15 X IF(KEY .NE. IHALPHA) GO TO 24`20 X IF(CROP(AITEM,6HMANUAL))GO TO 90`20 X IF( .NOT.CROP(AITEM,9HAUTOMATIC))GO TO 24 XC-------- INFORM USER OF AVAIL ENERGY AND READ IN DESIRED PHASER POWER X 2409 IF(NENHERE .EQ. 0) GO TO 26`20 X CALL CRAM(46HPHASERS LOCKED ON TARGET. ENERGY AVAILABLE = ) X25`09CALL CRAMF(ENERGY,0,2) X`09CALL CREND X`09IF (IPOOP.EQ.0) GO TO 26 X CALL CRAM(1H() X`09IREC=0 X`09DO 29 K=1,NENHERE X29`09IREC=ABS(KPOWER(K))/(PHASFAC*0.9**KDIST(K))*(1.01+0.05*RANF(0))+1. X`091 +IREC X CALL CRAMI(IREC,0) X CALL CRAM(3H) ) X CALL CRAM(22HUNITS TO FIRE AT ENEMY)`20 X CALL CREND X 26 CALL PROMPT(15HUNITS TO FIRE: ,15) X 27 CALL SCAN X`09POW=FNUM X28`09KEY1=KEY X IF(KEY .EQ. IHEOL) GO TO 2409`20 X 30 CALL SCAN`20 XC*** READ IN ITM FIRST CHAR IN COMMON SCANBRF X`09KEY2=KEY X`09KEY=KEY1 X IF(KEY2 .EQ. IHEOL)GO TO 35`20 X`09IF(ITM.NE.1HN) GOTO 34 X`09NO=1 X`09GO TO 35 X 34 CALL BEGPARD X GO TO 15 X 35 IF(KEY .NE. IHREAL) GO TO 26 X IF(POW .LT. ENERGY)GO TO 41 `20 X CALL CRAM(18HENERGY AVAILABLE= ) X GO TO 25 X 41 IF(POW .GE. 5.0)GO TO 46 X`09IF (POW.LE.0) GO TO 15 X`09CALL PROUT (45HMINIMUM ENERGY FOR AUTOMATIC FIRE IS 5 UNITS.,45) X GO TO 15 XC--------PRINT MESSAGE FOR SHIELD CONTROL, AND DECIDE IF MALFUNCTION OCCURS. X 42 CALL SKIP(1) X IF(RANF(0.).LT.0.995) GO TO 45 XC--------SOMETHING BAD HAS HAPPENED. X CALL REDALRT X CALL SKIP(1) X CALL PROUT(36HSULU: "SHIELD CONTROL MALFUNCTION!" ,36) `20 X CALL SKIP(1) X CALL PROUT(35HSAFETY INTERLOCK OVERRIDES PHASERS. ,35)`20 X RETURN X 45 CALL PROUT(16HSHIELDS LOWERED. ,16)`20 X GO TO IWHERE XC--------ALLOCATE ENERGY AMONG KLINGONS ACCORDING TO NEAREST FIRST XC STRATEGY AND COMPUTE HITS X 46 IF(IFAST .EQ. 0) GO TO 47`20 X ASSIGN 47 TO IWHERE`20 X GO TO 42 X 47 ENERGY=ENERGY-POW`20 X EXTRA=POW`20 X IF(NENHERE.EQ. 0)GO TO 75`20 XC--------- LOOP THAT DISTRIBUTES HITS IN AUTO MODE IS HERE.`20 X`09EXTRA=0.0 X`09POWREM=POW X DO 50 I=1,NENHERE`20 X`09HITS(I)=0. X`09IF (POWREM .LE. 0.) GO TO 50 X HITS (I)=ABS(KPOWER(I))/(PHASFAC*0.90**KDIST(I)) X OVER=(.01+.05*RANF(0))*HITS(I) X`09TEMP=POWREM X`09POWREM=POWREM-HITS(I)-OVER X IF(POWREM .LE. 0.) HITS(I)=AMIN1(TEMP,HITS(I)) X IF(POWREM .LE. 0.) OVER=0. X EXTRA=EXTRA+OVER X 50 CONTINUE X IF(POWREM .GT. 0.) EXTRA=EXTRA+POWREM`20 X CALL HITEM(HITS) `20 X IF(EXTRA.EQ.0 .OR. ALLDONE.NE.0) GO TO 200 XC--------- INFORM OF OVERKILL. X75 IF(ITHERE.EQ.0) GO TO 78 X CALL CRAM3AS X CALL CRAM(19HTHOLIAN WEB ABSORBS ) `20 X IF(NENHERE.GT.0) CALL CRAM(7H EXCESS ) `20 X CALL CRAMDMP(16H PHASER ENERGY. )`20 X GO TO 200 `20 X78 CALL CRAMF(EXTRA,0,2)`20 X CALL CRAMDMP(25H EXPENDED ON EMPTY SPACE.) X GO TO 200`20 XC-------- MANUAL SECTION BEGINS HERE.`20 XC-------- INFORM OF IMPOSED MANUAL CONDITION.`20 X 80 CALL PROUT(42HBATTLE COMPUTER DAMAGED; MANUAL FIRE ONLY.,42)`20 X GO TO 84 X 81 CALL SKIP(1) X CALL PROUT(13H---WORKING---,13) X CALL PROUT(27HSHORT-RANGE-SENSORS-DAMAGED,27) X CALL PROUT(43HINSUFFICIENT-DATA-FOR-AUTOMATIC-PHASER-FIRE,43) X CALL PROUT(24HMANUAL-FIRE-MUST-BE-USED,24)`20 X CALL SKIP(1) X 84 CALL CRAM(18HENERGY AVAILABLE= ) X CALL CRAMF(ENERGY-0.006,0,2) X CALL CREND XC--------- LOOP FOR DESIRED INDIVIDUAL HITS. X870`09K=1`20 X 87 IF(IPOOP .EQ. 0) GO TO 88`20 XC--------PRINT BATTLE-COMPUTER RECOMMENDATION`20 X CALL CRAM(1H() X IREC=ABS(KPOWER(K))/(PHASFAC*0.9**KDIST(K))*(1.01+0.05*RANF(0))+1. X CALL CRAMI(IREC,0) X CALL CRAM(3H) ) X 88 CALL CRAM(17HUNITS TO FIRE AT )`20 X II=KX(K) X JJ=KY(K) X IENM=QUAD(II,JJ) X CALL CRAMENA(IENM,2,II,JJ) X`09IF(IDOIT.EQ.1)GO TO 89 XC--------PHASERS CAN'T ACTUALLY BE FIRED - LOOP BACK FOR NEXT COMPUTER XC--------READOUT, OR TERMINATE IF THAT'S ALL X`09CALL CREND X`09K=K+1 X`09IF(K.LE.NENHERE)GO TO 87 X`09GO TO 15 X 89 CALL CRAM(3H: ) X CALL CRENDNO X 90 IF(K .EQ. 1)POW=0`20 X CALL SCAN X`09HITS(K)=FNUM X`09IF(KEY .EQ. IHREAL)GO TO 95`20 X`09IF (KEY.NE.IHEOL) GO TO 91 X`09IF(K .EQ. 1) GO TO 84 X`09GO TO 87 XC-------- BEG PARDON UNLESS KEY IS PHASER POWER, END-OF-LINE, OR 'NO'. X91`09IF (ITM.NE.1HN) GO TO 34 X`09NO=1 X`09GO TO 90 XC-------- IF HIT LESS THAN ZERO, ABORT PHASERS.`20 X 95 IF(HITS(K) .LT. 0)GO TO 15 X POW=POW+HITS(K)`20 XC-------- IF TOTAL AMOUNT OF POWER REQUESTED IS TOO MUCH, INFORM XC-------- AND START OVER.`20 X IF(POW .LT. ENERGY)GO TO 97`20 X CALL PROUT(26HAVAILABLE ENERGY EXCEEDED.,26)`20 X GO TO 84 X 97 K=K+1`20 X IF(K .LE. NENHERE) GO TO 90`20 XC--------IF TOTAL REQUESTED IS ZERO, ABORT PHASERS X IF(POW .EQ. 0.0) GO TO 15`20 X CALL SCAN`20 X IF(KEY .NE. IHALPHA) GO TO 9701`20 X`09IF(ITM.EQ.1HN) NO=1 X 9701 ENERGY=ENERGY-POW`20 X IF(IFAST .EQ. 0) GO TO 98`20 X ASSIGN 98 TO IWHERE`20 X GO TO 42 XC-------- GO DELIVER THE HITS. X 98 CALL HITEM(HITS) X IDIDIT=1 XC--------SAY SHIELDS RAISED OR MALFUNCTION, IF NECESSARY.`20 X 200 IF(ALLDONE.NE.0) RETURN`20 X IF(IFAST .EQ. 0) GO TO 210 X CALL SKIP(1) X IF(NO.NE.0) GO TO 202`20 X IF(RANF(0) .LT. 0.99) GO TO 205`20 X CALL PROUT(66HSULU: "SIR, THE HIGH-SPEED SHIELD CONTROL HAS MALFU X CNCTIONED . . .,66)`20 X CALL PROUT(`20 X +51H CLICK CLICK POP . . . NO RESPONSE, SIR!" ,51) `20 X 202 SHLDUP =0`20 X GO TO 210`20 X 205 CALL PROUT(15HSHIELDS RAISED.,15) XC--------CHECK FOR PHASER OVERHEAT X210`09IF(POW .LE. 1500.) RETURN X`09CHEKBRN=(POW-1500.)*.00038 X IF(RANF(0.) .GT. CHEKBRN) RETURN XC--------DO YOU SMELL SMOKE? X CALL SKIP(1) X CALL PROUT(48HWEAPONS OFFICER SULU: "PHASERS OVERHEATED, SIR." X`091 ,48) X`09DAMAGE(3) = DAMFAC*(1.0 + RANF(0))*(1.+CHEKBRN) X RETURN X END`20 $ CALL UNPACK TRPHASERS.FOR;1 1610966166 $ create 'f' X SUBROUTINE PHOTONS XC XC`0913-JUN-79 XC`09CORRECT 'THOLIAN DISAPPEARS' MESSAGE XC`09DON'T CHARGE PLAYER FOR A PLANET DESTROYED BY AN ENEMY XC X`09INCLUDE 'TREKCOM/NOLIST' X`09LOGICAL*1 IQUAD,ISHIP X`09REAL*8 AITEM X`09COMMON/SCANBF/KEY,AITEM X`09EQUIVALENCE (FNUM,AITEM),(SHIP,ISHIP) X DIMENSION TARG(3,2), COURSE(3) X REAL KP`20 X INTEGER BOT,TOP,TOP2 X EQUIVALENCE (CRACKS(1),HIT),(CRACKS(4),KSHOT)`20 X EQUIVALENCE (KSTUF(1),ITHERE),(KSTUF(2),ITHX),(KSTUF(3),ITHY)`20 X`09DATA IHDOC/'DO'/ XC--------CHECK TORPEDO COUNT AND STATUS OF PHOTON TUBES`20 X`09IDIDIT=1 X`09KSHOT=0 X IF(DAMAGE(4) .EQ. 0)GO TO 10 X CALL PROUT(21HPHOTON TUBES DAMAGED.,21) X GO TO 3005 X10 IF(TORPS .NE.0)GO TO 15`20 X CALL PROUT(18HNO TORPEDOES LEFT.,18)`20 X GO TO 3005 XC--------SCAN AND MAKE SENSE OF COMMAND INPUT LINE X 15 CALL SCAN`20 X`09TEMP=FNUM X N = TEMP + 0.5 X IF(KEY .EQ. IHREAL) GO TO 30 X 16 CALL CRAMI(TORPS,0)`20 X CALL CRAMDMP(16H TORPEDOES LEFT.)`20 X CALL PROMPT(30HNUMBER OF TORPEDOES TO FIRE: ,30) X GO TO 15 X 30 IF(N .LE. 0) GO TO 3005`20 X IF(N .LE. 3) GO TO 31`20 X CALL PROUT(33HMAXIMUM OF 3 TORPEDOES PER BURST.,33) X GO TO 16 X 3004 CALL BEGPARD X 3005 IDIDIT=0 X RETURN X 31 IF(N .LE. TORPS) GO TO 32`20 X GO TO 16 XC--------ALL TORPEDOES FIRED AT SAME SPOT. X 3101 DO 3102 I=2,N`20 X TARG(I,1)=TARG(1,1)`20 X 3102 TARG(I,2)=TARG(1,2)`20 X GO TO 36 XC--------READ IN TARGET SECTORS`20 X 32 DO 33 I=1,N`20 X CALL SCAN`20 X`09TARG(I,1)=FNUM X IF((I.EQ.1) .AND. (KEY.EQ.IHEOL)) GO TO 34 X IF((I .EQ. 2) .AND. (KEY .EQ. IHEOL)) GO TO 3101`20 X IF (KEY .NE. IHREAL) GO TO 3004`20 X CALL SCAN`20 X`09TARG(I,2)=FNUM X 33 IF (KEY .NE. IHREAL) GO TO 3004`20 X GO TO 36 X 34 DO 35 I=1,N`20 X`09CALL CHEW X CALL CRAM (33HTARGET SECTOR FOR TORPEDO NUMBER ) X CALL CRAMI(I,0)`20 X`09CALL CRAM(3H: ) X`09CALL CRENDNO X CALL SCAN`20 X`09TARG(I,1)=FNUM X IF (KEY .NE. IHREAL) GO TO 3004`20 X CALL SCAN`20 X`09TARG(I,2)=FNUM X 35 IF( KEY .NE. IHREAL) GO TO 3004`20 XC--------CHECK FOR INVALID TARGETS.`20 X 36 DO 37 I=1,N`20 X DO 37 J=1,2`20 X TEMP = TARG(I,J) X`09IF(TEMP.EQ.-1.) GO TO 3005 X 37 IF ((TEMP .LT. 0.999) .OR. (TEMP .GT. 10.001)) GO TO 3004`20 XC--------COMPUTE COURSE FOR EACH TORPEDO.`20 X DO 40 I=1,N`20 X DELTX = 0.1*(TARG(I,2)-SECTY)`20 X DELTY=0.1*(SECTX-TARG(I,1))`20 XC--------DO NOT ALLOW ENTERPRISE TO SHOOT A TORPEDO AT ITSELF. X IF((DELTX .NE. 0) .OR. (DELTY .NE. 0)) GO TO 40`20 X CALL SKIP(1) X CALL PROUT(41HSPOCK: "BRIDGE TO SICKBAY. DR. MC COY, ,41) `20 X CALL PROUT(36H I RECOMMEND AN IMMEDIATE REVIEW OF,36)`20 X CALL PROUT(41H THE CAPTAIN'S PSYCHOLOGICAL PROFILE." ,41) `20 X GO TO 3005 X 40 COURSE (I) = 1.90985932*ATAN2(DELTX,DELTY) XC--------BEGIN OUTER LOOP FOR MOVING TORPEDOES X I=0`20 X 50 I=I+1`20 X IF(I .GT. N) GO TO 115 X IF(CONDIT .NE. IHDOC ) TORPS=TORPS-1 X J=I`20 X`09STARTX=SECTX X`09STARTY=SECTY X R=(RANF(0)+RANF(0))*0.5 -0.5 X IF(ABS(R) .LT. 0.49) GO TO 5709`20 X R=(RANF(0)+1.2)*R`20 XC-------- TORPEDO MISFIRES X IF(N.GT.1) GO TO 5706`20 X CALL PROUT(21H***TORPEDO MISFIRES. ,21) `20 X GO TO 5707 X5706 CALL CRAM(18H***TORPEDO NUMBER ) X CALL CRAMI(I,0)`20 X CALL CRAMDMP(10H MISFIRES.)`20 X IF(I . LT. N) CALL PROUT(31H REMAINDER OF BURST ABORTED. ,31)`20 X I=N`20 X5707 IF(RANF(0.) .GT. .200000)GO TO 5709`20 XC------- CHECK IF MISFIRE DOES SHIP DAMAGE. IF SO DON'T GIVE TRACK.`20 X CALL PROUT(35H***PHOTON TUBES DAMAGED BY MISFIRE.,35) X DAMAGE(4)=DAMFAC*(1.0+2.0*RANF(0)) X GO TO 115`20 X5709 IF(SHLDUP.NE.0 .OR. CONDIT.EQ.IHDOC ) R=R+0.001*SHLD*R X AC=COURSE(I)+0.25*R`20 X GO TO 5710 XC*`20 X ENTRY KPHOTON`20 XC*`20 XC----------- SET FLAG FOR KLINGON `20 XC--------ENEMY FIRES PHOTON TORPEDO`20 X`09IX=KX(KSHOT) X`09IY=KY(KSHOT) X`09I=1 X`09N=1 X`09STARTX=IX X`09STARTY=IY X`09DELTX=0.1*(SECTY-STARTY) X`09DELTY=0.1*(STARTX-SECTX) X AC=1.90985932*ATAN2(DELTX,DELTY) X TEMP=RANF(0)-0.5 X R=TEMP*(1.0+0.001*KPOWER(KSHOT))+RANF(0.)*TEMP `20 X AC=AC+0.25*R X IQUAD=QUAD(IX,IY)`20 X CALL CRMSENA(IQUAD,0,IX,IY)`20 X CALL CRAMDMP(22H FIRES PHOTON TORPEDO. )`20 XC--------CHECK FOR KLINGON MISFIRE X IF(ABS(TEMP) .LT. 0.45) GO TO 5710 XC--------ENEMY TORPEDO MISFIRED. DETERMINE DAMAGE.`20 X ANGLE=(15.0-AC)*0.5235988 `20 X HIT=200.0 + 600.0*RANF(0)`20 X LL=KSHOT X CALL PROUT(21H***TORPEDO MISFIRES! ,21)`20 X GO TO 68 X 5710 ANGLE=(15.0-AC)*0.5235988`20 X IF(N .EQ. 1)GO TO 58`20 X CALL SKIP(1) X CALL CRAM(25HTRACK FOR TORPEDO NUMBER )`20 X CALL CRAMI(J,0)`20 X 5720 CALL CRAM(6H: )`20 X GO TO 59 X58 CALL SKIP(1) X CALL CRAM(15HTORPEDO TRACK: )`20 X59 DELTAX=-SIN(ANGLE) X DELTAY=COS(ANGLE)`20 X BIGGER=AMAX1(ABS(DELTAX),ABS(DELTAY))`20 X DELTAX=DELTAX/BIGGER X DELTAY=DELTAY/BIGGER X`09X=STARTX X`09Y=STARTY XC--------BEGIN INNER LOOP FOR MOVING A SINGLE TORPEDO`20 X L=0`20 X 5910 L=L+1`20 X X=X+DELTAX X IX=X+0.5 X IF(IX .LT. 1 .OR. IX .GT. 10)GO TO 105 X Y=Y+DELTAY X IY=Y+0.5 X IF(IY .LT. 1 .OR. IY .GT. 10)GO TO 105 X IF(L .EQ. 4 .OR. L .EQ. 9)CALL CREND X CALL CRAMF(X,0,1)`20 X CALL CRAM(3H - ) X CALL CRAMF(Y,0,1)`20 X CALL CRAM(3H ) X IQUAD=QUAD(IX,IY)`20 X IF(IQUAD.EQ.IHDOT) GOTO 5910 `20 XC--------BEGIN HIT CHECKS`20 X CALL CREND `20 XC--------COMPUTE EXACT ANGLE TO SECTOR HIT, DISTANCE TO SECTOR HIT,`20 XC NORMAL MISS DISTANCE, AND HIT X DIST=SQRT((STARTX-IX)**2 + (STARTY-IY)**2) X`09DELTX=0.1*(IY-STARTY) X`09DELTY=0.1*(STARTX-IX) X BULSEYE=1.90985932*ATAN2(DELTX,DELTY)`20 X BULSEYE=(15.0-BULSEYE)*0.5235988 X SINANG=SIN(ANGLE-BULSEYE)`20 X DISTN=ABS(SINANG) * DIST X HIT=700.0+100.0*RANF(0)-1000.0*DISTN XC--------TEST FOR AND COPE WITH HIT ON KLINGON,ROMULAN, OR COMMANDER.`20 X IF(IQUAD .EQ. IHK .OR. IQUAD .EQ. IHR) GO TO 62`20 X IF(IQUAD .NE. IHC .AND. IQUAD .NE. IHS) GO TO 70 X IF(RANF(0) .GT. 0.05) GO TO 62 X CALL CRMSENA(IQUAD,2,IX,IY)`20 X CALL CRAMDMP(25H USES ANTI-PHOTON DEVICE;) X CALL PROUT(23H TORPEDO NEUTRALIZED.,23) X GO TO 50 X62 DO 65 LL=1,NENHERE X IF(IX.EQ.KX(LL) .AND. IY.EQ.KY(LL)) GO TO 68 X65 CONTINUE X68 KP=KPOWER(LL)`20 X KPOWER(LL)=KP-SIGN(AMIN1(ABS(KP),HIT),KP)`20 X IF(KPOWER(LL) .NE. 0.0) GO TO 69 X CALL DEADKL(IX,IY,IQUAD,IX,IY) X GO TO 50 X 69 CALL CRMSENA(IQUAD,2,IX,IY)`20 XC--------IF ENEMY DAMAGED BUT NOT DESTROYED, TRY TO DISPLACE HIM X 6901 ANG=ANGLE + 2.5*(RANF(0)-0.5)`20 X TEMP=AMAX1(ABS(-SIN(ANG)),ABS(COS(ANG))) X XX=-SIN(ANG) / TEMP`20 X YY= COS(ANG) / TEMP`20 X JX=IX+XX+0.5 X JY=IY+YY+0.5 X IF(JX.LT.1 .OR. JX.GT.10 .OR. JY.LT.1 .OR. JY.GT.10) GO TO 6905`20 X IF(QUAD(JX,JY) .NE. '@') GO TO 6903`20 XC--------SOMEONE FALLS INTO A BLACK HOLE +-+-+-+-+-+-+-+- END OF PART 12 +-+-+-+-+-+-+-+-