C CHANGED TO USE THE FLECS STRUCTURED FORTRAN BY M.R. BROWN C TARLUG 27-OCT-79 C PROGRAM PLAYER COMMON /DFILE/ ENERGY(8),SHIELD(8),XCORD(8),YCORD(8),TORPS(8), $ PHA(8),I1,I2,HYPER(8),ISENT(8,10), $ XPOD(8),YPOD(8),DPOD(8),IPOD(8), $ SCORE(8),CREW(8),DIR(8),WARP(8),LAUNCH(8),UNIV(100,100), $ MESSAG(480),THRU,XSHIP(8),CLOAK(8),SCAN(8) REAL LAUNCH INTEGER CREW,HYPER,TORPS LOGICAL*1 XSHIP,CLOAK,SCAN BYTE THRU,UNIV,MESSAG LOGICAL*1 OK,DONE,YES,WARN,RESET BYTE BLANK(80),COMMND DIMENSION IPRM(2),JPRM(2) COMMON/INBUF/INBUF(50),IOST(2) EQUIVALENCE (INBUF,COMMND) BYTE IBUF(1000) C THE NEXT TWO LINES ARE TO IMPROVE SPEED BY REDUCING THE NUMBER OF C LOOPS TO RESET EWBUF FROM 21X17 TO 44 REAL*8 DUMMY(44) EQUIVALENCE (NEWBUF,DUMMY) BYTE OLDBUF(21,17),NEWBUF(22,17),OLDREP(11,8),NEWREP(11,8) BYTE OLDSCR(7,8),NEWSCR(7,8) INTEGER WHO BYTE ESCPOS(2) C C************************************************************************ C * C THE FOLLOWING PARAMETERS ARE FOR CURSOR ADDRESSING. THEY ARE * C SPECIFICALLY FOR A BEEHIVE 100 TERMINAL AND MAY HAVE TO BE * C MODIFIED FOR DIFFERENT TERMINALS. ESCPOS CONTAINS THE ESCAPE * C SEQUENCE FOR CURSOR ADDRESSING AND IOFSET IS THE OFFSET TO * C CONVERT THE LINE/COLUMN NUMBER TO THE APPROPRIATE OCTAL CODE. * C * C CHANGED TO VT52 M.R. BROWN 27-OCT-79 C NOW ATTEMPTING HPTERMINAL DATA ESCPOS/"33,"131/ DATA IOFSET/"40/ C * C************************************************************************ C DATA IAST/0/ DATA RESET/.TRUE./ DATA BLANK/80*' '/ DATA OK/.FALSE./ C CALL ERRSET(64,.TRUE.,.FALSE.,.TRUE.,.FALSE.,) WRITE(1,*)' WELCOME TO MULTI-TREK' REPEAT UNTIL (OK) WRITE(1,*) ' THE FOLLOWING VESSELS ARE AVAILABLE FOR USE.' DO(I=1,8) IF (.NOT. XSHIP(I)) WRITE(1,*)' SHIP ',I FIN FIN WRITE(1,1201) 1201 FORMAT('$ENTER THE NUMBER OF THE VESSEL YOU WISH TO COMMAND :') CALL GETINT(WHO,OK,1,8) WHEN(XSHIP(WHO)) WRITE(1,*)' THIS SHIP ALREADY HAS A COMMANDER' WRITE(1,1002) 1002 FORMAT('$DO YOU WISH TO SHARE THIS COMMAND ?') CALL YESNO(OK) FIN ELSE SCORE(WHO)=0. FIN FIN XSHIP(WHO)=.TRUE. CREW(WHO)=CREW(WHO)+1 DIR(WHO)=90. WARP(WHO)=0. C C INCREMENT PLAYER COUNT WHEN( THRU.GT.0 ) THRU=THRU+1 FIN ELSE THRU=1 FIN C C SET UP TERMINAL INPUT/OUTPUT PARAMETERS CALL RDAST(IAST) CALL GETADR(IPRM,IBUF) C CALL GETADR(JPRM,INBUF(2)) C JPRM(2)=49 C REPEAT UNTIL (DONE) C C CHECK FOR INPUTS C IF(IAST.NE.0) C INBUF(1)=ICHAR() C WHEN(INBUF(1).LE.26)IOST(2)=0 C ELSE C CALL WTQIO("1020,1,1,,IOST,JPRM) C IOST(2)=IOST(2)+1 C FIN C WHEN( IOST(1).EQ.-10) C CLOSE (UNIT=1) C COMMND=0 C FIN C ELSE C IF (IOST(2).EQ.0 ) C COMMND=' ' C FIN C FIN C IAST=0 C IAST=IAST-1 CALL GETLIN(IOST(2),INBUF) IF(IOST(2).EQ.0)COMMND=' ' FIN C C C GENERATE NEW DISPLAY IX1=XCORD(WHO)-10. IF( IX1 .LT. 1)IX1=1 IX2=XCORD(WHO)+10. IF (IX2 .GT. 100)IX2=100 IY1=YCORD(WHO)-8. IF (IY1 .LT. 1) IY1=1 IY2=YCORD(WHO)+8. IF (IY2 .GT. 100) IY2=100 C C DO(IX=1,21) C DO(IY=1,17) C NEWBUF(IX,IY)=' ' C FIN C FIN C C THE ABOVE LOOPS ARE REPLACE BY THE FOLLOWING: MRB C DO (ID=1,44) DUMMY(ID)=' ' C IBY=0 DO(IY=IY2,IY1,-1) IBY=IBY+1 IBX=1 DO(IX=IX1,IX2) NEWBUF(IBX,IBY)=UNIV(IX,IY) K=NEWBUF(IBX,IBY) IF ((K.GE.49).AND.(K.LE.56).AND.CLOAK(K-48) ) NEWBUF(IBX,IBY)=46 FIN IBX=IBX+1 FIN 10 CONTINUE FIN IBX=IBX-1 C C GENERATE REPORT C WHEN( DIR(WHO).GT.90. ) VALUE=(450.-DIR(WHO))/30. FIN ELSE VALUE=(90.-DIR(WHO))/30. FIN IF (VALUE.EQ.0.) VALUE=0. FIN ENCODE(88,101,NEWREP) VALUE,WARP(WHO),ENERGY(WHO), + SHIELD(WHO),HYPER(WHO),TORPS(WHO),CREW(WHO),THRU 101 FORMAT(F5.2,6X, F4.2,7X, G11.5, G11.5, I1,10X, I2,9X, I3,8X, + I3,8X) C C GENERATE SCORES ENCODE(56,102,NEWSCR) SCORE 102 FORMAT(8F7.0) C C C C DISPLAY TITLES, LABELS,ETC. WHEN( RESET) CALL CLEAR CALL WRITE(1,6,'COORDINATES') CALL WRITE(4,3,'HEADING :') CALL WRITE(5,6,'WARP :') CALL WRITE(6,4,'ENERGY :') CALL WRITE(7,3,'SHIELDS :') CALL WRITE(8,1,'HYPER SET :') CALL WRITE(9,1,'TORPEDOES :') CALL WRITE(10,1,'CREW SIZE :') CALL WRITE(11,3,'PLAYERS :') CALL WRITE(1,67,'SHIP SCORES') DO(IY=1,IBY ) ENCODE(42,103,IBUF) (NEWBUF(IX,IY),IX=1,IBX) 103 FORMAT(21(A1,1X)) CALL WRITE(IY,24,IBUF,41) FIN C C SET OLD = NEW C DO(IX=1,21) DO(IY=1,17) OLDBUF(IX,IY)=NEWBUF(IX,IY) FIN FIN DO(IY=1,8 ) ENCODE(11,104,IBUF) (NEWREP(IX,IY),IX=1,11) 104 FORMAT(11A1) CALL WRITE(IY+3,12,IBUF,11) ENCODE(7,105,IBUF) (NEWSCR(IX,IY),IX=1,7) 105 FORMAT(7A1) CALL WRITE(IY+5,72,IBUF,7) CALL WRITE(IY+5,69,IY+"60) DO(IX=1,11) OLDREP(IX,IY)=NEWREP(IX,IY) FIN DO(IX=1,7) OLDSCR(IX,IY)=NEWSCR(IX,IY) FIN FIN RESET=.FALSE. FIN ELSE C C COMPARE DISPLAYS KBUF=1 DO(IY=1,17) DO(IX=1,21) IF( NEWBUF(IX,IY).NE.OLDBUF(IX,IY) ) KX=2*(IX-1)+24+IOFSET KY=IY+IOFSET IBUF(KBUF)=ESCPOS(1) IBUF(KBUF+1)=ESCPOS(2) IBUF(KBUF+2)=KY IBUF(KBUF+3)=KX IBUF(KBUF+4)=NEWBUF(IX,IY) KBUF=KBUF+5 OLDBUF(IX,IY)=NEWBUF(IX,IY) FIN FIN FIN C C COMPARE REPORTS DO(IY=1,8) DO(IX=1,11 ) IF ( OLDREP(IX,IY).NE.NEWREP(IX,IY) ) KX=IX+11+IOFSET KY=IY+3+IOFSET IBUF(KBUF)=ESCPOS(1) IBUF(KBUF+1)=ESCPOS(2) IBUF(KBUF+2)=KY IBUF(KBUF+3)=KX IBUF(KBUF+4)=NEWREP(IX,IY) KBUF=KBUF+5 OLDREP(IX,IY)=NEWREP(IX,IY) FIN FIN C C COMPARE SCORES DO(IX=1,7 ) IF ( OLDSCR(IX,IY).NE.NEWSCR(IX,IY) ) KX=IX+71+IOFSET KY=IY+5+IOFSET IBUF(KBUF)=ESCPOS(1) IBUF(KBUF+1)=ESCPOS(2) IBUF(KBUF+2)=KY IBUF(KBUF+3)=KX IBUF(KBUF+4)=NEWSCR(IX,IY) KBUF=KBUF+5 OLDSCR(IX,IY)=NEWSCR(IX,IY) FIN FIN FIN C C UPDATE DISPLAY IF CHANGED C KBUF=KBUF-1 IF ( KBUF.GT.1 ) IPRM(2)=KBUF CALL WTQIO("410,1,1,,,IPRM) FIN FIN C C UPDATE COORDINATES C ENCODE(16,106,IBUF) XCORD(WHO),YCORD(WHO) 106 FORMAT('X:',F5.1,' Y:',F5.1) CALL WRITE(2,4,IBUF,16) C IF( COMMND.NE.0 ) C CLEAR THE BOTTOM OF THE SCREEN CALL CLEARS(17,1) C SELECT(COMMND) C C COURSE COMMAND C ('C') WHEN(IOST(2).EQ.1) WRITE(1,1004) 1004 FORMAT('$COURSE, SIR ?') CALL GETREL(VALUE,OK,0.,12.) FIN ELSE CALL GETRLL(VALUE,OK,0.,12.) FIN IF (OK) WHEN(VALUE .GE. 3.) DIR(WHO)=(15.-VALUE)*30. FIN ELSE DIR(WHO)=(3.-VALUE)*30. FIN FIN FIN C C HYPERSPACE COMMAND C ('H') WHEN( IOST(2).EQ.1) WRITE(1,1005) 1005 FORMAT('$NEW HYPERSPACE JUMP SETTING ? ') CALL GETINT(II,OK,1,6) FIN ELSE CALL GETINL(II,OK,1,6) FIN IF (OK) HYPER(WHO)=II FIN C C HELP COMMAND C (' ') WRITE(1,100) 100 FORMAT(' A 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 RESET DISPLAY',T51, 5 'Z LAUNCH ANTI-MATTER'/' L LOCATE SHIP',T30, 6 'S SHIELD CHANGE',T51,' DISPLAY HELP MESSAGE') FIN C C QUIT COMMAND C ('Q') WHEN( IOST(2).EQ.1) WRITE(1,*) ' YOUR CURRENT SCORE IS ',SCORE(WHO) WRITE(1,1007) 1007 FORMAT('$ARE YOU SURE YOU WANT TO QUIT NOW ? ') CALL YESNO(DONE) FIN ELSE CALL YESNOL(DONE) FIN IF (DONE) CREW(WHO)=CREW(WHO)-1 IF (CREW(WHO) .EQ. 400) XSHIP(WHO)=.FALSE. FIN FIN FIN C C RESET COMMAND C ('R') RESET=.TRUE. FIN C C SHIELD COMMAND C ('S') WHEN( IOST(2).EQ.1) WRITE(1,1006) 1006 FORMAT('$ENGINEERING TO BRIDGE, HOW MUCH ENERGY SIR ? ') CALL GETREL(VALUE,OK,-1.E36,1.E36) FIN ELSE CALL GETRLL(VALUE,OK,-1.E36,1.E36) FIN IF (OK) WHEN(ENERGY(WHO)-VALUE .GE. 0. .AND. SHIELD(WHO)+VALUE .GE. 0.) ENERGY(WHO)=ENERGY(WHO)-VALUE SHIELD(WHO)=SHIELD(WHO)+VALUE FIN ELSE WRITE(1,*)' I AM SORRY CAPTAIN, BUT THAT IS IMPOSSIBLE.' FIN FIN FIN C C TORPEDO COMMAND C ('T') WHEN(LAUNCH(WHO) .LT. 0.) WHEN(TORPS(WHO) .GT. 0) WHEN(IOST(2).EQ.1) WRITE(1,1008) 1008 FORMAT('$PHOTON TORPEDO READY, COURSE ?') CALL GETREL(VALUE,OK,0.,12.) FIN ELSE CALL GETRLL(VALUE,OK,0.,12.) FIN WHEN (OK) WHEN(VALUE .GE. 3.) VALUE=(15.-VALUE)*30. FIN ELSE VALUE=(3.-VALUE)*30. FIN FIN ELSE VALUE=DIR(WHO) FIN LAUNCH(WHO)=VALUE TORPS(WHO)=TORPS(WHO)-1 IF(TORPS(WHO) .EQ. 0) WRITE(1,1009) 1009 FORMAT('$TORPEDO ROOM TO BRIDGE. LAST TORPEDO, SIR.') FIN WRITE(1,*)' TORPEDO LAUNCHED, HEADING ',VALUE,' DEGREES.' FIN ELSE WRITE(1,*)' SO SORRY CAPTAIN, BUT WE ARE OUT OF TORPEDOES' FIN FIN ELSE WRITE(1,*)' TORPEDO TUBES ARE NOT READY YET CAPTAIN !' FIN FIN C C C PHASER COMMAND C ('P') WHEN (PHA(WHO) .LT. 0.) WHEN(IOST(2).EQ.1) WRITE(1,1010) 1010 FORMAT('$PHASER CONTROL READY. COURSE ?') CALL GETREL(VALUE,OK,0.,12.) FIN ELSE CALL GETRLL(VALUE,OK,0.,12.) FIN WHEN(OK) WHEN(VALUE .GE. 3.) VALUE=(15.-VALUE)*30. FIN ELSE VALUE=(3.-VALUE)*30. FIN FIN ELSE VALUE=DIR(WHO) FIN PHA(WHO)=VALUE ENERGY(WHO)=ENERGY(WHO)-50. WRITE(1,*)' PHASERS FIRED CAPTAIN' FIN ELSE WRITE(1,*)' PHASER CONTROL TO BRIDGE, PHASERS ARE NOT READY YET.' FIN FIN C C LONG RANGE SCAN COMMAND C ('L') WHEN(IOST(2).EQ.1) WRITE(1,*)' SPOCK HERE CAPTAIN.' WRITE(1,1011) 1011 FORMAT('$ON WHAT FREQUENCY SHOULD I SET THE SCAN ? ') CALL GETINT(II,OK,1,8) FIN ELSE CALL GETINL(II,OK,1,8) FIN IF (OK) SCAN(II)=.TRUE. IX=XCORD(II)/10. IY=YCORD(II)/10. WRITE(1,*)' SCANNERS REPORT LIFE FORMS IN SECTOR ',IX,',',IY X=IX*10 Y=IY*10 D=ATAN2(Y-YCORD(WHO),X-XCORD(WHO))*180./3.14159 WHEN(D .GT. 90.) D=(450.-D)/30. FIN ELSE D=(90.-D)/30. FIN WRITE(1,*)' I APPROXIMATE A COURSE OF ',D,' SHOULD TAKE' WRITE(1,*)' US TO THE CENTER OF THAT SECTOR.' FIN FIN C C MESSAGE COMMAND C ('M') WHEN(IOST(2).EQ.1) WRITE(1,1012) 1012 FORMAT('$UHURA HERE CAPTAIN, TO WHOM ARE WE SENDING ? ') CALL GETINT(IVAL,OK,1,8) FIN ELSE CALL GETINL(IVAL,OK,1,8) FIN IF (.NOT. OK) IVAL=WHO FIN WRITE(1,1013) 1013 FORMAT('$MESSAGE CAPTAIN ? ') READ(1,300,END=12) (MESSAG(I),I=IVAL*60-58,IVAL*60) 300 FORMAT(60A1) GOTO 13 12 CLOSE(UNIT=1) 13 CONTINUE ENERGY(WHO)=ENERGY(WHO)-10. ENCODE(1,107,COMMND) WHO 107 FORMAT(I1) CALL STRMOV(COMMND,1,1,MESSAG,IVAL*60-59) FIN C C CLOAKING COMMAND C ('F') WHEN(.NOT. CLOAK(WHO)) CLOAK(WHO)=.TRUE. WRITE(1,*)' SPOCK HERE CAPTAIN. CLOAKING DEVICE COMING ON NOW!' WRITE(1,*)' WE ARE FADING OUT.....' FIN ELSE WRITE(1,*)' BUT CAPTAIN WE ARE ALREADY CLOAKED ?!' FIN FIN C ('A') WHEN(CLOAK(WHO)) CLOAK(WHO)=.FALSE. WRITE(1,*)' SPOCK HERE CAPTAIN. CLOAKING DEVICE DEACTIVATED.' WRITE(1,*)' WE ARE NOW VISIBLE.....' FIN ELSE WRITE(1,*)' BUT CAPTAIN WE ARE NOT CLOAKED !' FIN FIN C C WARP FACTOR COMMAND C ('W') WHEN( IOST(2).EQ.1) WRITE(1,1003) 1003 FORMAT('$WARP FACTOR, SIR ?') CALL GETREL(WARP(WHO),OK,0.,8.) FIN ELSE CALL GETRLL(WARP(WHO),OK,0.,8.) FIN IF (.NOT. OK)WARP(WHO)=0. FIN C C C EXPLODE ANTI-MATTER DEVICE C ('X') WHEN(IPOD(WHO) .EQ. 2) IPOD(WHO)=3 WRITE(1,*)' ANTI-MATTER DETONATION SIGNALED, SIR!' FIN ELSE WRITE(1,*)' CAPTAIN, WE DO NOT HAVE AN ACTIVE ANTI MATTER DEVICE' FIN FIN C C LAUNCH ANTI-MATTER DEVICE C ('Z') WHEN(IPOD(WHO) .EQ. 0) WHEN(IOST(2).EQ.1) WRITE(1,1014) 1014 FORMAT('$ANTI MATTER DEVICE READY SIR, COURSE ? ') CALL GETREL(VALUE,OK,0.,12.) FIN ELSE CALL GETRLL(VALUE,OK,0.,12.) FIN WHEN(OK) WHEN(VALUE .GE. 3.) DPOD(WHO)=(15.-VALUE)*30. FIN ELSE DPOD(WHO)=(3.-VALUE)*30. FIN FIN ELSE DPOD(WHO)=DIR(WHO) FIN IPOD(WHO)=1 FIN ELSE WRITE(1,*)' SORRY CAPTAIN, BUT WE ARE OUT OF ANTI-MATTER PODS' FIN FIN (OTHERWISE) WRITE(1,*)' I AM SORRY CAPTAIN, BUT I DID NOT UNDERSTAND THAT.' FIN FIN COMMND=0 FIN C C * WRITE OUT MESSAGES FROM DRIVER C CALL POSITN(18,1) IF (ISENT(WHO,1).NE.0) DO(I=1,10) SELECT(ISENT(WHO,I)) (1) WRITE(1,*)' WE ARE NOW DOCKED CAPTAIN.' (2) WRITE(1,*)' ** CAPTAIN ! WE HIT A STAR! **' (3) DO(IK=1,3) CALL CLEAR WRITE(1,99) 99 FORMAT( ////////////,25X,'*** BOOM ***') FIN WRITE(1,*)' YOU',1H','RE SHIP HAS BEEN DESTROYED' WRITE(1,*)' FORTUNATELY YOU ESCAPED WITH YOUR LIFE.' WRITE(1,*)' UNFORTUNATELY, YOU HAVE BEEN GIVEN A NEW COMMAND.' WRITE(1,1015) 1015 FORMAT('$ARE YOU READY TO ACCEPT THIS ASSIGNMENT ?') CALL YESNO(YES) WHEN(YES ) WRITE(1,*)' GOOD!' FIN ELSE WRITE(1,*)' TOUGH LUCK, BUT YOU GET IT ANYWAY.' FIN XSHIP(WHO)=.TRUE. RESET=.TRUE. FIN (4) WRITE(1,*) ' CAPTAIN WE HAVE BEEN HIT BY A PHOTON TORPEDO' FIN (5) WRITE(1,*)' * TORPEDO HIT ALIEN SHIP, SIR. *' (6) WRITE(1,*)' * PHASER HIT ON ALIEN VESSEL, SIR *' (7) WRITE(1,*)' PHASER HIT ON TORPEDO, SIR' (8) WRITE(1,*)' PHASER MISSED' (9) WRITE(1,*) ' ** SIR! WE HAVE RAMMED AN ALIEN VESSEL **' FIN (10) WRITE(1,*) ' * SIR! WE HAVE COLLIDED WITH AN ALIEN VESSEL *' FIN (11) WRITE(1,*)' PHASER HIT ON STAR SIR' (12) WRITE(1,*)' BASE REPORTS THEY ARE BEING ATTACKED SIR.' (13) WRITE(1,*)' TORPEDO HIT ON STAR SIR' (14) WRITE(1,*) ' SIR, WE ARE UNDER PHASER ATTACK!' FIN (15) WRITE(1,*)' SPOCK HERE CAPTAIN.' WRITE(1,*)' WE ARE BEING DRAWN INTO SOME SORT OF BLACK HOLE,' WRITE(1,*)' IT IS UNLIKE ANYTHING I HAVE EVER ENCOUNTERED.' WRITE(1,*)' FASCINATING.' CALL WAIT(2,2,M) FIN (16) WRITE(1,*)' SCOTT HERE CAPTAIN' WRITE(1,*)' OUR DYLITHIUM CRYSTALS ARE GONE. LIFE SUPPORT IS ' WRITE(1,*)' FAILING ...!' CALL WAIT(2,2,M) FIN (17) WRITE(1,*)' CAPTAIN WE ARE GOING INTO HYPERSPACE' (18) WRITE(1,*)' HYPERSPACE JUMP BLOCKED SIR .' (19) WRITE(1,*)' SIR! WE ARE ENTERING SOME SORT OF HYPERSPACE FIELD' (20) WRITE(1,*)' TORPEDO HIT ON TORPEDO SIR !.' (21) WRITE(1,*)' HIT HAD NO EFFECT, APPARENTLY IT IS A GHOST SHIP' (22) WRITE(1,*)' SULU HERE CAPTAIN,' WRITE(1,*)' THE ALIEN VESSEL HAS BEEN DESTROYED' FIN (23) WRITE(1,*)' ANTI-MATTER POD LAUNCH WAS BLOCKED SIR' (24) WRITE(1,*)' ANTI-MATTER POD HAS BEEN DESTROYED' (25) WRITE(1,*)' PHASER HIT ON ANTI-MATTER POD, SIR!' (26) WRITE(1,*)' TORPEDO HIT ON ANTI-MATTER POD, SIR!' (27) WRITE(1,*)' SIR, SENSORS REPORT A METALLIC OBJECT IS NEAR' (28) WRITE(1,*)' ANTI-MATTER POD SUCCESSFULLY LAUNCHED, SIR.' (29) WRITE(1,*)' ** ANTI-MATTER POD DETONATED SIR **' (30) WRITE(1,*) ' SIR, WE ARE CAUGHT IN AN ANTI-MATTER EXPLOSION!' CALL WAIT(2,2,M) FIN (31) WRITE(1,*)' IIEEEEEE!' FIN (OTHERWISE) CONTINUE FIN ISENT(WHO,I)=0 FIN FIN IF(SCAN(WHO)) C CLEAR THE BOTTOM OF THE SCREEN CALL CLEARS(17,1) WRITE(1,*) ' CAPTAIN, I AM PICKING UP A STRANGE SIGNAL,' WRITE(1,*) ' I BELIEVE WE ARE BEING SCANNED BY AN ALIEN' SCAN(WHO)=.FALSE. FIN IF (MESSAG(WHO*60-59) .NE. ' ') C CLEAR THE BOTTOM OF THE SCREEN CALL CLEARS(17,1) WRITE(1,*)' CAPTAIN, A MESSAGE IS COMING IN ON SUB SPACE RADIO' WRITE(1,1000) MESSAG(WHO*60-59) 1000 FORMAT(' FREQUENCY ',A1,' ***') WRITE(1,1001) (MESSAG(I),I=WHO*60-58,WHO*60) 1001 FORMAT(10X,60A1) CALL STRMOV(BLANK,1,60,MESSAG,WHO*60-59) CALL WAIT(2,2,M) FIN WHEN((ENERGY(WHO) .LT. 900.) .AND. WARN ) C CLEAR THE BOTTOM OF THE SCREEN CALL CLEARS(17,1) WRITE(1,*)' SCOTT HERE CAPTAIN,' WRITE(1,*)' OUR ENERGY SUPPLY IS GETTING DANGEROUSLY LOW, SIR.' WARN=.FALSE. FIN ELSE WARN=.TRUE. FIN C C THIS INSTRUCTION IS TO DELAY A HALF SECOND BEFORE CONTINUING CALL WAIT(30,0,M) C FIN C C DECREMENT PLAYER COUNT THRU=THRU-1 CALL CLEAR STOP END SUBROUTINE GETREL(VARI,EXIST,LOW,HIGH) C COMMON/INBUF/INBUF(50),IOST(2) LOGICAL*1 EXIST,OK REAL VARI,LOW,HIGH BYTE INPUT(15),LEFTED(15) INTEGER NCHRS IFLAG=0 GO TO 10 ENTRY GETRLL IFLAG=1 10 CONTINUE OK=.FALSE. REPEAT UNTIL (OK) DO(I=1,15) LEFTED(I)=' ' FIN WHEN(IFLAG.EQ.0) READ(1,100,END=800) NCHRS,(INPUT(I),I=1,15) 100 FORMAT(Q,15A1) GOTO 810 800 CLOSE(UNIT=1) 810 CONTINUE FIN ELSE NCHRS=IOST(2)-2 DECODE(17,2100,INBUF(2)) INPUT 2100 FORMAT(2X,15A1) IFLAG=0 FIN CONDITIONAL (NCHRS .EQ. 0) OK=.TRUE. EXIST=.FALSE. FIN (NCHRS .LE. 15) C * LEFT ADJUST INPUT CALL STRMOV(INPUT,1,NCHRS,LEFTED,16-NCHRS) DECODE(15,101,LEFTED,ERR=200) VARI 101 FORMAT(G15.0) WHEN(VARI .GE. LOW .AND. VARI .LE. HIGH) OK=.TRUE. EXIST=.TRUE. FIN ELSE WRITE(1,*)' SORRY CAPTAIN, BUT YOUR COMMAND''S PARAMETER MUST' WRITE(1,*) ' BE BETWEEN ',LOW,' AND ',HIGH FIN GO TO 300 200 CONTINUE WRITE(1,1016) 1016 FORMAT('$WOULD YOU PLEASE REPEAT THAT SIR ? ') 300 CONTINUE FIN (OTHERWISE) WRITE(1,1017) 1017 FORMAT('$RUN THAT BY ME AGAIN ! ') FIN FIN FIN RETURN END SUBROUTINE GETINT(NUM,FLAG,LOW,HIGH) INTEGER NUM,LOW,HIGH COMMON/INBUF/INBUF(50),IOST(2) LOGICAL*1 OK,FLAG C IFLAG=0 GO TO 10 ENTRY GETINL IFLAG=1 10 CONTINUE C OK=.FALSE. REPEAT UNTIL (OK) WHEN( IFLAG.EQ.0 ) READ(1,102,END=800,ERR=200) NCHRS,NUM 102 FORMAT(Q,I5) GOTO 810 800 CLOSE(UNIT=1) 810 CONTINUE FIN ELSE NCHRS=IOST(2)-2 DECODE(7,103,INBUF(2)) NUM 103 FORMAT(2X,I) IFLAG=0 FIN WHEN( NCHRS .EQ. 0 ) FLAG=.FALSE. OK=.TRUE. FIN ELSE WHEN((NUM .GE. LOW) .AND. (NUM .LE. HIGH)) OK=.TRUE. FLAG=.TRUE. FIN ELSE WRITE(1,*)' WHAT ? THAT COMMAND REQUIRES A NUMBER THAT IS' WRITE(1,1018)LOW,HIGH 1018 FORMAT( '$BETWEEN',F8.2,' AND ',F8.2,'TRY AGAIN : ') FIN GOTO 300 200 CONTINUE WRITE(1,1019) 1019 FORMAT('$TRY AGAIN BOZO : ') 300 CONTINUE FIN FIN RETURN END SUBROUTINE YESNO(FLAG) COMMON/INBUF/INBUF(50),IOST(2) LOGICAL*1 FLAG,OK BYTE YES(4),NO(4) BYTE ANSWER(4) DATA YES/'Y','E','S',' '/ DATA NO/'N','O',' ',' '/ C IFLAG=O GO TO 10 ENTRY YESNOL IFLAG=1 10 CONTINUE C OK=.FALSE. REPEAT UNTIL (OK ) WHEN(IFLAG.EQ.0) READ(1,104,END=800) NCHRS, (ANSWER(I),I=1,4) 104 FORMAT(Q,4A1) GOTO 810 800 CLOSE(UNIT=1) 810 CONTINUE FIN ELSE NCHRS=IOST(2)-2 DECODE(6,105,INBUF(2)) ANSWER 105 FORMAT(2X,4A1) IFLAG=0 FIN IF ((NCHRS .GT. 4) .OR. (NCHRS .LT. 1)) NCHRS=4 FIN C * CHECK FOR YES I=KOMSTR(YES,1,NCHRS,ANSWER,1) WHEN( I .EQ. 0 ) FLAG=.TRUE. OK=.TRUE. FIN ELSE C * CHECK FOR A NO I=KOMSTR(NO,1,NCHRS,ANSWER,1) WHEN( I .EQ. 0 ) FLAG=.FALSE. OK=.TRUE. FIN ELSE C * INCORRECT RESPONSE WRITE(1,*)' ** PLEASE ANSWER "YES" OR "NO" **' WRITE(1,1020) 1020 FORMAT('$ANSWER ? ') FIN FIN FIN RETURN END