SUBROUTINE PHASER INCLUDE 'TREK.COM/-LI' INCLUDE 'TREK2.COM/-LI' REAL*8 AITEM LOGICAL CROP BYTE ITM COMMON/SCANBF/KEY,AITEM EQUIVALENCE (FNUM,AITEM) EQUIVALENCE (ITM,AITEM) REAL HITS(20) BYTE IHN INTEGER HNO REAL*8 MANUAL,AUTOMA DATA HNO,MANUAL,AUTOMA/'NO','MANUAL','AUTOMAT'/ DATA IHN/'N'/ DATA PHSFAC/2.0/ IFAST=0 NO=0 IDIDIT=1 IPOOP=1 IF(DAMAGE(1)+DAMAGE(11) .GT. 0.0) IPOOP=0 C--------ENSURE PHASERS CAN BE FIRED IF(CONDIT .NE.IHDCKD )GO TO 5 CALL PROUT( + 44HPHASERS CAN'T BE FIRED THROUGH BASE SHIELDS.,44) GO TO 15 5 IF(DAMAGE(3) .EQ. 0)GO TO 10 CALL PROUT(23HPHASER CONTROL DAMAGED.,23) GO TO 15 C--------DO CHECKS FOR HI-SPEED SHIELD CONTROL 10 IF(SHLDUP .EQ. 0)GO TO 20 IF(DAMAGE(13) .EQ. 0.) GO TO 13 CALL PROUT(34HHIGH-SPEED SHIELD CONTROL DAMAGED.,34) GO TO 15 13 IF(ENERGY .GT. 200.) GO TO 16 CALL PROUT(58HINSUFFICIENT ENERGY TO ACTIVATE HIGH-SPEED SHIELD CO CNTROL. ,58) 15 IDIDIT=0 IF(IFAST.NE.0) ENERGY=ENERGY+200.0 RETURN 16 ENERGY=ENERGY-200. IFAST = 1 C--------READ IN AMOUNT OF ENERGY TO EXPEND ON PHASER FIRE 20 CALL SCAN POW=FNUM IF(NENHER .EQ. 0) GO TO 35 K=1 IF(KEY.EQ.IHALPH) GOTO 23 IF(KEY.EQ.IHREAL) GOTO 28 IF(.NOT.CROP(AITEM,HNO)) GOTO 23 NO=1 CALL SCAN POW=FNUM 23 IF(KEY .EQ. IHALPH .AND.CROP(AITEM,MANUAL))GO TO 90 IF(DAMAGE(11).NE.0)GO TO 80 IF(DAMAGE(1).NE.0) GO TO 81 C------- IS KEY EOL,AUTO OR PHAS POWER? IF(KEY .NE. IHALPH)GO TO 2301 IF(CROP(AITEM,AUTOMA))GO TO 27 GO TO 24 C-------- DIFFERENTIATE BETWEEN EOL AND PHASER POWER(COMMAND MODE) 2301 IF(KEY .NE. IHEOL)GO TO 30 C------ REQUEST MANUAL OR AUTO 24 CALL MANORA CALL SCAN IF(FNUM.EQ.-1.) GO TO 15 IF(KEY .NE. IHALPH) GO TO 24 IF(CROP(AITEM,MANUAL))GO TO 90 IF( .NOT.CROP(AITEM,AUTOMA))GO TO 24 C-------- INFORM USER OF AVAIL ENERGY AND READ IN DESIRED PHASER POWER 2409 IF(NENHER .EQ. 0) GO TO 26 CALL CRAM(46HPHASERS LOCKED ON TARGET. ENERGY AVAILABLE = ) 25 CALL CRAMF(ENERGY,0,2) CALL CREND CALL CRAM(1H() IREC=0 DO 29 K=1,NENHER 29 IREC=ABS(KPOWER(K))/(PHSFAC*0.9**KDIST(K))*(1.01+0.05*RANF(0))+1. 1 +IREC CALL CRAMI(IREC,0) CALL CRAM(3H) ) CALL CRAM(22HUNITS TO FIRE AT ENEMY) CALL CREND 26 CALL PROMPT(15HUNITS TO FIRE= ,15) 27 CALL SCAN POW=FNUM 28 KEY1=KEY IF(KEY .EQ. IHEOL) GO TO 2409 30 CALL SCAN C*** READ IN ITM FIRST CHAR IN COMMON SCANBRF KEY2=KEY KEY=KEY1 IF(KEY2 .EQ. IHEOL)GO TO 35 IF(ITM.NE.IHN) GOTO 34 NO=1 GO TO 35 34 CALL BEGPRD GO TO 15 35 IF(KEY .NE. IHREAL) GO TO 26 IF(POW .LT. ENERGY)GO TO 41 CALL CRAM(18HENERGY AVAILABLE= ) GO TO 25 41 IF(POW .GT. 0)GO TO 46 GO TO 15 C--------PRINT MESSAGE FOR SHIELD CONTROL, AND DECIDE IF MALFUNCTION OCCURS. 42 CALL SKIP(1) IF(RANF(0.).LT.0.995) GO TO 45 C--------SOMETHING BAD HAS HAPPENED. CALL RDALRT CALL SKIP(1) CALL PROUT(36HSULU: "SHIELD CONTROL MALFUNCTION!" ,36) CALL SKIP(1) CALL PROUT(35HSAFETY INTERLOCK OVERRIDES PHASERS. ,35) RETURN 45 CALL PROUT(16HSHIELDS LOWERED. ,16) GO TO IWHERE C--------ALLOCATE ENERGY AMONG KLINGONS ACCORDING TO NEAREST FIRST C STRATEGY AND COMPUTE HITS 46 IF(IFAST .EQ. 0) GO TO 47 ASSIGN 47 TO IWHERE GO TO 42 47 ENERGY=ENERGY-POW EXTRA=POW IF(NENHER.EQ. 0)GO TO 75 C--------- LOOP THAT DISTRIBUTES HITS IN AUTO MODE IS HERE. EXTRA=0.0 POWREM=POW DO 50 I=1,NENHER HITS(I)=0. IF (POWREM .LE. 0.) GO TO 50 HITS (I)=ABS(KPOWER(I))/(PHSFAC*0.90**KDIST(I)) OVER=(.01+.05*RANF(0))*HITS(I) TEMP=POWREM POWREM=POWREM-HITS(I)-OVER IF(POWREM .LE. 0.) HITS(I)=AMIN1(TEMP,HITS(I)) IF(POWREM .LE. 0.) OVER=0. EXTRA=EXTRA+OVER 50 CONTINUE IF(POWREM .GT. 0.) EXTRA=EXTRA+POWREM CALL HITEM(HITS) IF(EXTRA.EQ.0 .OR. ALLDON.NE.0) GO TO 200 C--------- INFORM OF OVERKILL. 75 IF(ITHERE.EQ.0) GO TO 78 CALL CRM3AS CALL CRAM(19HTHOLIAN WEB ABSORBS ) IF(NENHER.GT.0) CALL CRAM(7H EXCESS ) CALL CRMDMP(16H PHASER ENERGY. ) GO TO 200 78 CALL CRAMF(EXTRA,0,2) CALL CRMDMP(25H EXPENDED ON EMPTY SPACE.) GO TO 200 C-------- MANUAL SECTION BEGINS HERE. C-------- INFORM OF IMPOSED MANUAL CONDITION. 80 CALL PROUT(42HBATTLE COMPUTER DAMAGED; MANUAL FIRE ONLY.,42) GO TO 84 81 CALL SKIP(1) CALL PROUT(13H---WORKING---,13) CALL PROUT(27HSHORT-RANGE-SENSORS-DAMAGED,27) CALL PROUT(43HINSUFFICIENT-DATA-FOR-AUTOMATIC-PHASER-FIRE,43) CALL PROUT(24HMANUAL-FIRE-MUST-BE-USED,24) CALL SKIP(1) 84 CALL CRAM(18HENERGY AVAILABLE= ) CALL CRAMF(ENERGY-0.006,0,2) CALL CREND C--------- LOOP FOR DESIRED INDIVIDUAL HITS. K=1 87 IF(IPOOP .EQ. 0) GO TO 88 C--------PRINT BATTLE-COMPUTER RECOMMENDATION CALL CRAM(1H() IREC=ABS(KPOWER(K))/(PHSFAC*0.9**KDIST(K))*(1.01+0.05*RANF(0))+1. CALL CRAMI(IREC,0) CALL CRAM(3H) ) 88 CALL CRAM(17HUNITS TO FIRE AT ) II=KX(K) JJ=KY(K) IENM=QUAD(II,JJ) CALL CRMENA(IENM,2,II,JJ) CALL CRAM(3H: ) CALL CRNDNO 90 IF(K .EQ. 1)POW=0 CALL SCAN HITS(K)=FNUM IF(KEY.EQ.IHALPH .AND. ITM.EQ.IHN) NO=1 IF(KEY .EQ. IHREAL)GO TO 95 IF(KEY .EQ. IHALPH) GO TO 90 IF(K .EQ. 1) GO TO 84 GO TO 87 C-------- IF HIT LESS THAN ZERO, ABORT PHASERS. 95 IF(HITS(K) .LT. 0)GO TO 15 POW=POW+HITS(K) C-------- IF TOTAL AMOUNT OF POWER REQUESTED IS TOO MUCH, INFORM C-------- AND START OVER. IF(POW .LT. ENERGY)GO TO 97 CALL PROUT(26HAVAILABLE ENERGY EXCEEDED.,26) GO TO 84 97 K=K+1 IF(K .LE. NENHER) GO TO 90 C--------IF TOTAL REQUESTED IS ZERO, ABORT PHASERS IF(POW .EQ. 0.0) GO TO 15 CALL SCAN IF(KEY .NE. IHALPH) GO TO 9701 IF(ITM.EQ.IHN) NO=1 9701 ENERGY=ENERGY-POW IF(IFAST .EQ. 0) GO TO 98 ASSIGN 98 TO IWHERE GO TO 42 C-------- GO DELIVER THE HITS. 98 CALL HITEM(HITS) IDIDIT=1 C--------SAY SHIELDS RAISED OR MALFUNCTION, IF NECESSARY. 200 IF(ALDONE.NE.0) RETURN IF(IFAST .EQ. 0) GO TO 210 CALL SKIP(1) IF(NO.NE.0) GO TO 202 IF(RANF(0) .LT. 0.99) GO TO 205 CALL PROUT(66HSULU: "SIR, THE HIGH-SPEED SHIELD CONTROL HAS MALFU CNCTIONED . . .,66) CALL PROUT( +51H CLICK CLICK POP . . . NO RESPONSE, SIR!" ,51) 202 SHLDUP =0 GO TO 210 205 CALL PROUT(15HSHIELDS RAISED.,15) C--------CHECK FOR PHASER OVERHEAT 210 IF(POW .LE. 1500.) RETURN CHKBRN=(POW-1500.)*.00038 IF(RANF(0.) .GT. CHKBRN) RETURN C--------DO YOU SMELL SMOKE? CALL SKIP(1) CALL PROUT(48HWEAPONS OFFICER SULU: "PHASERS OVERHEATED, SIR." 1 ,48) DAMAGE(3) = DAMFAC*(1.0 + RANF(0))*(1.+CHKBRN) RETURN END