PROGRAM PLAYER TEXT COMMON EQUIVALENCE (A,COMMND) LOGICAL*1 OK,DONE,YES,WARN BYTE BLANK(80),BUFF(22,22),ISPOT(25),COMMND INTEGER WHO DATA BLANK/80*' '/ DATA OK/.FALSE./ C CALL ERRSET(64,.TRUE.,.FALSE.,.TRUE.,.FALSE.,) WRITE(5,) FORMAT('0WELCOME TO MULTI-TREK') UNTIL OK DO WRITE(5,) FORMAT('0THE FOLLOWING VESSELS ARE AVAILIABLE FOR USE.') FOR I=1 UNTIL 8 DO IF .NOT. XSHIP(I) THEN WRITE(5,) I FORMAT(' SHIP ',I1) ENDIF ENDDO WRITE(5,) FORMAT('$ENTER THE NUMBER OF THE VESSEL YOU WISH TO COMMAND :') CALL GETINT(WHO,OK,1,8) IF XSHIP(WHO) THEN WRITE(5,) FORMAT('0THIS SHIP ALREADY HAS A COMMANDER') WRITE(5,) FORMAT('$DO YOU WISH TO SHARE THIS COMMAND ?') CALL YESNO(OK) ELSE SCORE(WHO)=0. ENDIF ENDDO XSHIP(WHO)=.TRUE. CREW(WHO)=CREW(WHO)+1 C C INCREMENT PLAYER COUNT IF THRU.GT.0 THEN THRU=THRU+1 ELSE THRU=1 ENDIF C UNTIL DONE DO WRITE(5,) FORMAT('$',15X,'COMMAND :') READ(5,,END=100) A FORMAT(A4) GOTO 110 100 CLOSE(UNIT=5) 110 CONTINUE SELECT C C WARP FACTOR COMMAND C WHEN COMMND .EQ. 'W' THEN WRITE(5,) FORMAT('0WARP FACTOR SIR ?') CALL GETREL(WARP(WHO),OK,0.,8.) IF .NOT. OK THEN WARP(WHO)=0. ENDIF WRITE(5,) WARP(WHO) FORMAT('0 WARP FACTOR ',F5.2,' SIR.') C C COURSE COMMAND C WHEN COMMND .EQ. 'C' THEN WRITE(5,) FORMAT('0COURSE SIR ?') CALL GETREL(VALUE,OK,0.,12.) IF OK THEN IF VALUE .GE. 3. THEN DIR(WHO)=(15.-VALUE)*30. ELSE DIR(WHO)=(3.-VALUE)*30. ENDIF WRITE(5,) VALUE FORMAT('0 HEADING ',F5.2,' SIR.') ENDIF C C HYPERSPACE COMMAND C WHEN COMMND .EQ. 'H' THEN IF KOMSTR(A,1,4,'HELP',1).EQ.0 THEN WRITE(5,1000) 1000 FORMAT('0A APPEAR (CLOAKING OFF)',T30,'M SEND MESSAGE',T51, 1 'T FIRE TORPEDOES'/' C COURSE HEADING',T30,'P FIRE PHASERS', 2 T51,'W SET WARP SPEED'/' F FADE (CLOAKING ON)',T30, 3 'Q QUIT',T51,'X DETONATE ANTI-MATTER'/ 4 ' H HYPERSPACE SETTING',T30,'R STATUS REPORT',T51, 5 'Z LAUNCH ANTI-MATTER'/' L LOCATE SHIP',T30, 6 'S SHIELD CHANGE',T51,'HELP DISPLAY HELP MESSAGE'/ 7 ' DISPLAY IMMEDIATE AREA'/) ELSE WRITE(5,) HYPER(WHO) FORMAT('0CURRENT HYPERSPACE JUMP SETTING IS ',I1,' SIR.') WRITE(5,) FORMAT('$NEW SETTING ?') CALL GETINT(II,OK,1,6) IF OK THEN HYPER(WHO)=II ENDIF ENDIF C C SHIELD COMMAND C WHEN COMMND .EQ. 'S' THEN WRITE(5,) FORMAT('0ENGINEERING TO BRIDGE, HOW MUCH ENERGY SIR ?') CALL GETREL(VALUE,OK,-1.E36,1.E36) IF OK THEN IF ENERGY(WHO)-VALUE .GE. 0. .AND. SHIELD(WHO)+VALUE .GE. 0. + THEN ENERGY(WHO)=ENERGY(WHO)-VALUE SHIELD(WHO)=SHIELD(WHO)+VALUE WRITE(5,) FORMAT('0AYE, CAPTAIN.') ELSE WRITE(5,) FORMAT('0I AM SORRY CAPTAIN, BUT THAT IS IMPOSSIBLE.') ENDIF ENDIF WRITE(5,) SHIELD(WHO) FORMAT('0DEFLECTOR SHIELDS ARE NOW AT ',F7.2,' UNITS SIR.') C C LOCAL SCAN COMMAND C WHEN COMMND .EQ. ' ' THEN CALL CLEAR IX1=XCORD(WHO)-10. IF IX1 .LT. 1 THEN IX1=1 ENDIF IX2=XCORD(WHO)+10. IF IX2 .GT. 100 THEN IX2=100 ENDIF IY1=YCORD(WHO)-10. IF IY1 .LT. 1 THEN IY1=1 ENDIF IY2=YCORD(WHO)+10. IF IY2 .GT. 100 THEN IY2=100 ENDIF IBY=0 FOR IY=IY1 UNTIL IY2 DO IBY=IBY+1 IBX=1 FOR IX=IX1 UNTIL IX2 DO BUFF(IBX,IBY)=UNIV(IX,IY) IBX=IBX+1 ENDDO ENDDO IX=IX2-IX1+1 IY=IY2-IY1+1 DO 10 IBY=IY,1,-1 ISC=0 DO 9 IBX=1,IX ISC=ISC+1 ISPOT(ISC)=BUFF(IBX,IBY) IF (ISPOT(ISC) .GE. 49) .AND. (ISPOT(ISC) .LE. 56) .AND. + CLOAK(ISPOT(ISC)-48) THEN ISPOT(ISC)=46 ENDIF 9 CONTINUE WRITE(5,) (ISPOT(ISC),ISC=1,IX) FORMAT(20X,22(A1,1X)) 10 CONTINUE WRITE(5,) XCORD(WHO),YCORD(WHO) FORMAT(30X,'CURRENT POSTION IS ',F5.1,',',F5.1) C C QUIT COMMAND C WHEN COMMND .EQ. 'Q' THEN WRITE(5,) SCORE(WHO) FORMAT('0YOUR CURRENT SCORE IS ',F8.0) WRITE(5,) FORMAT('$ARE YOU SURE YOU WANT TO QUIT NOW ?') CALL YESNO(DONE) IF DONE THEN CREW(WHO)=CREW(WHO)-1 IF CREW(WHO) .EQ. 400 THEN XSHIP(WHO)=.FALSE. ENDIF ENDIF C C REPORT COMMAND C WHEN COMMND .EQ. 'R' THEN WRITE(5,) FORMAT('0CURRENT STATUS REPORT, CAPTAIN.') WRITE(5,) XCORD(WHO),YCORD(WHO) FORMAT(/20X,'LOCATION X:',F5.1,' Y:',F5.1) WRITE(5,) WARP(WHO) FORMAT(20X,'WARP FACTOR :',F6.2) IF DIR(WHO) .GT. 90. THEN VALUE=(450.-DIR(WHO))/30. ELSE VALUE=(90.-DIR(WHO))/30. ENDIF WRITE(5,) VALUE FORMAT(20X,'HEADING :',F5.2) WRITE(5,) HYPER(WHO) FORMAT(20X,'HYPER SET :',I1) WRITE(5,) ENERGY(WHO) FORMAT(/20X,'ENERGY :',F7.1) WRITE(5,) SHIELD(WHO) FORMAT(20X,'DEFLECTORS :',F7.1) WRITE(5,) TORPS(WHO) FORMAT(20X,'TORPEDOES :',I3) WRITE(5,) CREW(WHO) FORMAT(20X,'CREW SIZE :',I3) WRITE(5,) SCORE(WHO) FORMAT(/20X,'RATING :',F8.0) C C TORPEDO COMMAND C WHEN COMMND .EQ. 'T' THEN IF LAUNCH(WHO) .LT. 0. THEN IF TORPS(WHO) .GT. 0 THEN WRITE(5,) FORMAT('0PHOTON TORPEDO READY, COURSE ?') CALL GETREL(VALUE,OK,0.,12.) IF OK THEN IF VALUE .GE. 3. THEN VALUE=(15.-VALUE)*30. ELSE VALUE=(3.-VALUE)*30. ENDIF ELSE VALUE=DIR(WHO) ENDIF LAUNCH(WHO)=VALUE TORPS(WHO)=TORPS(WHO)-1 IF TORPS(WHO) .EQ. 0 THEN WRITE(5,) FORMAT('0TORPEDO ROOM TO BRIDGE.') WRITE(5,) FORMAT(20X,'THIS IS OUR LAST TORPEDO SIR.') ENDIF WRITE(5,) VALUE FORMAT('0TORPEDO LAUNCHED, HEADING ',F7.2,' DEGREES.') ELSE WRITE(5,) FORMAT('0SO SORRY CAPTAIN, BUT WE ARE OUT OF TORPEDOES') ENDIF ELSE WRITE(5,) FORMAT('0TORPEDO TUBES ARE NOT READY YET CAPTAIN !') ENDIF C C PHASER COMMAND C WHEN COMMND .EQ. 'P' THEN IF PHA(WHO) .LT. 0. THEN WRITE(5,) FORMAT('0PHASER CONTROL READY. COURSE ?') CALL GETREL(VALUE,OK,0.,12.) IF OK THEN IF VALUE .GE. 3. THEN VALUE=(15.-VALUE)*30. ELSE VALUE=(3.-VALUE)*30. ENDIF ELSE VALUE=DIR(WHO) ENDIF PHA(WHO)=VALUE ENERGY(WHO)=ENERGY(WHO)-50. WRITE(5,) FORMAT('0PHASERS FIRED CAPTAIN') ELSE WRITE(5,) FORMAT('0PHASER CONTROL TO BRIDGE, PHASERS ARE NOT READY YET.') ENDIF C C LONG RANGE SCAN COMMAND C WHEN COMMND .EQ. 'L' THEN WRITE(5,) FORMAT('0SPOCK HERE CAPTAIN.') WRITE(5,) FORMAT('$ON WHAT FREQUENCY SHOULD I SET THE SCAN ?') CALL GETINT(II,OK,1,8) IF OK THEN IX=XCORD(II)/10. IY=YCORD(II)/10. WRITE(5,) IX,IY FORMAT(' SCANNERS REPORT LIFE FORMS IN SECTOR ',I3,','I3) X=IX*10 Y=IY*10 D=ATAN2(Y-YCORD(WHO),X-XCORD(WHO))*180./3.14159 IF D .GT. 90. THEN D=(450.-D)/30. ELSE D=(90.-D)/30. ENDIF WRITE(5,) FORMAT('0SPOCK HERE CAPTAIN,') WRITE(5,) D FORMAT(' I APPROXIMATE A COURSE OF ',F13.9,' WOULD TAKE') WRITE(5,) FORMAT(' US TO THE CENTER OF THAT SECTOR.') ENDIF C C MESSAGE COMMAND C WHEN COMMND .EQ. 'M' THEN WRITE(5,) FORMAT('$UHURA HERE CAPTAIN, TO WHOM ARE WE SENDING?') CALL GETINT(IVAL,OK,1,8) IF .NOT. OK THEN IVAL=WHO ENDIF WRITE(5,) FORMAT('0MESSAGE CAPTAIN ?') READ(5,,END=12) (MESSAG(I),I=IVAL*60-58,IVAL*60) FORMAT(60A1) GOTO 13 12 CLOSE(UNIT=5) 13 CONTINUE ENERGY(WHO)=ENERGY(WHO)-10. ENCODE(1,,COMMND) WHO FORMAT(I1) CALL STRMOV(COMMND,1,1,MESSAG,IVAL*60-59) C C CLOAKING COMMAND C WHEN COMMND .EQ. 'F' THEN IF .NOT. CLOAK(WHO) THEN CLOAK(WHO)=.TRUE. TYPE *,' SPOCK HERE CAPTAIN.' TYPE *,' CLOAKING DEVICE COMING ON NOW!' TYPE *,' WE ARE FADING OUT.....' ELSE TYPE *,' BUT CAPTAIN WE ARE ALREADY CLOAKED ?!' ENDIF C WHEN COMMND .EQ. 'A' THEN IF CLOAK(WHO) THEN CLOAK(WHO)=.FALSE. TYPE *,' SPOCK HERE CAPTAIN.' TYPE *,' CLOAKING DEVICE DEACTIVATED.' TYPE *,' WE ARE NOW VISABLE.....' ELSE TYPE *,' BUT CAPTAIN WE ARE NOT CLOAKED !' ENDIF C C C EXPLODE ANTI-MATTER DEVICE C WHEN COMMND .EQ. 'X' THEN IF IPOD(WHO) .EQ. 2 THEN IPOD(WHO)=3 WRITE(5,) FORMAT('0ANTI-MATTER DETONATION SIGNALED, SIR!') ELSE WRITE(5,) FORMAT('0CAPTAIN, WE DO NOT HAVE AN ACTIVE ANTI MATTER ', + 'DEVICE.') ENDIF C C LAUNCH ANTI-MATTER DEVICE C WHEN COMMND .EQ. 'Z' THEN IF IPOD(WHO) .EQ. 0 THEN WRITE(5,) FORMAT('0ANTI MATTER DEVICE READY SIR, COURSE ?') CALL GETREL(VALUE,OK,0.,12.) IF OK THEN IF VALUE .GE. 3. THEN DPOD(WHO)=(15.-VALUE)*30. ELSE DPOD(WHO)=(3.-VALUE)*30. ENDIF ELSE DPOD(WHO)=DIR(WHO) ENDIF IPOD(WHO)=1 ELSE WRITE(5,) FORMAT('0SORRY CAPTAIN, BUT WE ARE OUT OF ANTI-MATTER PODS') ENDIF OTHERWISE WRITE(5,) FORMAT('0I AM SORRY CAPTAIN, BUT I DID NOT UNDERSTAND THAT.') ENDS C C WRITE SCORES WRITE(5,) (SCORE(K),K=1,8) FORMAT(' SCORES:',7(F7.0,2X),F7.0) C C * WRITE OUT MESSAGES FROM DRIVER C FOR I=1 UNTIL 10 DO SELECT USING ISENT(WHO,I) WHEN 1 THEN TYPE *,' WE ARE NOW DOCKED CAPTAIN.' WHEN 2 THEN TYPE *,' ** CAPTAIN ! WE HIT A STAR! **' WHEN 3 THEN FOR IK=1 UNTIL 3 DO CALL CLEAR WRITE(5,) FORMAT(////////////,25X,'*** BOOM ***') ENDDO WRITE(5,) FORMAT(//' YOU',1H','RE SHIP HAS BEEN DESTROYED') TYPE *,' FORTUNATELY YOU ESCAPED WITH YOUR LIFE.' TYPE *,' UNFORTUNATELY, YOU HAVE BEEN GIVEN A NEW COMMAND.' WRITE(5,) FORMAT(/'$ARE YOU READY TO ACCEPT THIS ASSIGNMENT ?') CALL YESNO(YES) IF YES THEN TYPE *,' GOOD!' ELSE TYPE *,' TOUGH LUCK, BUT YOU GET IT ANYWAY.' ENDIF XSHIP(WHO)=.TRUE. WHEN 4 THEN WRITE(5,) FORMAT(' CAPTAIN WE HAVE BEEN HIT BY A PHOTON TORPEDO') WHEN 5 THEN TYPE *,' * TORPEDO HIT ALIEN SHIP, SIR. *' WHEN 6 THEN TYPE *,' * PHASER HIT ON ALIEN VESSEL, SIR *' WHEN 7 THEN TYPE *,' PHASER HIT ON TORPEDO, SIR' WHEN 8 THEN TYPE *,' PHASER MISSED' WHEN 9 THEN WRITE(5,) FORMAT(' ** SIR! WE HAVE RAMMED AN ALIEN VESSEL **') C WHEN 10 THEN WRITE(5,) FORMAT(' * SIR! WE HAVE COLLIDED WITH AN ALIEN VESSEL *') C WHEN 11 THEN TYPE *,' PHASER HIT ON STAR SIR' C WHEN 12 THEN TYPE *,' BASE REPORTS THEY ARE BEING ATTACKED SIR.' C WHEN 13 THEN TYPE *,' TORPEDO HIT ON STAR SIR' C WHEN 14 THEN WRITE(5,) FORMAT(' SIR, WE ARE UNDER PHASER ATTACK!') C WHEN 15 THEN TYPE *,' SPOCK HERE CAPTAIN.' TYPE *,' WE ARE BEING DRAWN INTO SOME SORT OF BLACK HOLE,' TYPE *,' IT IS UNLIKE ANYTHING I HAVE EVER ENCOUNTERED.' TYPE *,' FACINATING.' CALL WAIT(2,2,M) C WHEN 16 THEN TYPE *,' SCOTT HERE CAPTAIN' TYPE *,' OUR DYLITHIUM CRYSTALS ARE GONE. LIFE SUPPORT IS ' TYPE *,' FAILING ...!' CALL WAIT(2,2,M) C WHEN 17 THEN TYPE *,' CAPTAIN WE ARE GOING INTO HYPERSPACE' C WHEN 18 THEN TYPE *,' HYPERSPACE JUMP BLOCKED SIR .' WHEN 19 THEN TYPE *,' SIR! WE ARE ENTERING SOME SORT OF HYPERSPACE FIELD' WHEN 20 THEN TYPE *,' TORPEDO HIT ON TORPEDO SIR !.' WHEN 21 THEN TYPE *,' HIT HAD NO EFFECT, APPARENTLY IT IS A GHOST SHIP' C WHEN 22 THEN TYPE *,' SULU HERE CAPTAIN,' TYPE *,' THE ALIEN VESSEL HAS BEEN DESTROYED' TYPE *,' ***********************************' C WHEN 23 THEN TYPE *,' ANTI-MATTER POD LAUNCH WAS BLOCKED SIR' C WHEN 24 THEN TYPE *,' ANTI-MATTER POD HAS BEEN DESTROYED' C WHEN 25 THEN TYPE *,' PHASER HIT ON ANTI-MATTER POD, SIR!' C WHEN 26 THEN TYPE *,' TORPEDO HIT ON ANTI-MATTER POD, SIR!' C WHEN 27 THEN TYPE *,' SIR, SENSORS REPORT A METALLIC OBJECT IS NEAR' C WHEN 28 THEN TYPE *,' ANTI-MATTER POD SUCCESSFULLY LAUNCHED, SIR.' C WHEN 29 THEN TYPE *,' ** ANTI-MATTER POD DETONATED SIR **' C WHEN 30 THEN WRITE(5,) FORMAT(' SIR, WE ARE CAUGHT IN AN ANTI-MATTER EXPLOSION!') CALL WAIT(2,2,M) C WHEN 31 THEN WRITE(5,) FORMAT(' IIEEEEEE!') C OTHERWISE CONTINUE ENDS ISENT(WHO,I)=0 ENDDO IF MESSAG(WHO*60-59) .NE. ' ' THEN WRITE(5,) FORMAT('0CAPTAIN, A MESSAGE IS COMING IN ON SUB SPACE RADIO') WRITE(5,) MESSAG(WHO*60-59) FORMAT(' FREQUENCY ',A1,' ***') WRITE(5,) (MESSAG(I),I=WHO*60-58,WHO*60) FORMAT(10X,60A1) CALL STRMOV(BLANK,1,60,MESSAG,WHO*60-59) CALL WAIT(2,2,M) ENDIF IF (ENERGY(WHO) .LT. 900.) .AND. WARN THEN TYPE *,' SCOTT HERE CAPTAIN,' TYPE *,' OUR ENERGY SUPPLY IS GETTING DANGEROUSLY LOW, SIR.' WARN=.FALSE. ELSE WARN=.TRUE. ENDIF ENDDO C C DECREMENT PLAYER COUNT THRU=THRU-1 STOP END SUBROUTINE GETREL(VARI,EXIST,LOW,HIGH) C LOGICAL*1 EXIST,OK REAL VARI,LOW,HIGH BYTE INPUT(15),LEFTED(15) INTEGER NCHRS OK=.FALSE. UNTIL OK .DO FOR I=1 UNTIL 15 . DO LEFTED(I)=' ' ENDDO TYPE 99 99 FORMAT(1H$,'>') READ(5,100,END=800) NCHRS,(INPUT(I),I=1,15) 100 FORMAT(Q,15A1) GOTO 810 800 CLOSE(UNIT=5) 810 CONTINUE SELECT WHEN NCHRS .EQ. 0 . THEN OK=.TRUE. EXIST=.FALSE. WHEN NCHRS .LE. 15 THEN C * LEFT ADJUST INPUT CALL STRMOV(INPUT,1,NCHRS,LEFTED,16-NCHRS) DECODE(15,,LEFTED,ERR=200) VARI FORMAT(G15.0) IF VARI .GE. LOW .AND. VARI .LE. HIGH . THEN OK=.TRUE. EXIST=.TRUE. ELSE WRITE(5,) FORMAT('0SORRY CAPTAIN, BUT YOUR COMMAND',1H','S PARAMETER') WRITE(5,150) LOW,HIGH 150 FORMAT(1H ,'MUST BE BETWEEN ',F15.4,' AND ',F15.4) ENDIF GO TO 300 200 TYPE *,'WOULD YOU PLEASE REPEAT THAT SIR ?' 300 CONTINUE OTHERWISE WRITE(5,) FORMAT(' RUN THAT BY ME AGAIN !') ENDS ENDDO RETURN END SUBROUTINE GETINT(NUM,FLAG,LOW,HIGH) INTEGER NUM,LOW,HIGH LOGICAL*1 OK,FLAG OK=.FALSE. UNTIL OK DO READ(5,,END=800,ERR=200) NCHRS,NUM FORMAT(Q,I5) GOTO 810 800 CLOSE(UNIT=5) 810 CONTINUE IF NCHRS .EQ. 0 THEN FLAG=.FALSE. OK=.TRUE. ELSE IF (NUM .GE. LOW) .AND. (NUM .LE. HIGH) THEN OK=.TRUE. FLAG=.TRUE. ELSE WRITE(5,) FORMAT('0WHAT ? THAT COMMAND REQUIRES A NUMBER THAT IS') WRITE(5,) LOW,HIGH FORMAT(' BETWEEN ',I5,' AND ',I5) WRITE(5,) FORMAT(1H$,' TRY AGAIN :') ENDIF GOTO 300 200 WRITE(5,100) 100 FORMAT(1H$,' TRY AGAIN BOZO :') 300 CONTINUE ENDIF ENDDO RETURN END SUBROUTINE YESNO(FLAG) LOGICAL*1 FLAG,OK BYTE YES(4),NO(4) BYTE ANSWER(4) DATA YES/'Y','E','S',' '/ DATA NO/'N','O',' ',' '/ OK=.FALSE. UNTIL OK DO READ(5,,END=800) NCHRS, (ANSWER(I),I=1,4) FORMAT(Q,4A1) GOTO 810 800 CLOSE(UNIT=5) 810 CONTINUE IF (NCHRS .GT. 4) .OR. (NCHRS .LT. 1) THEN NCHRS=4 ENDIF C * CHECK FOR YES I=KOMSTR(YES,1,NCHRS,ANSWER,1) IF I .EQ. 0 THEN FLAG=.TRUE. OK=.TRUE. ELSE C * CHECK FOR A NO I=KOMSTR(NO,1,NCHRS,ANSWER,1) IF I .EQ. 0 THEN FLAG=.FALSE. OK=.TRUE. ELSE C * INCORRECT RESPONSE WRITE(5,) FORMAT('0** PLEASE ANSWER "YES" OR "NO" **') WRITE(5,) FORMAT('$ ANSWER ? ') ENDIF ENDIF ENDDO RETURN END