SUBROUTINE XQTCMD( COMMND, ME, DONE ) # EXECUTE AN ENTERED COMMAND DEFINE (DIG0,48) INCLUDE COMMON.RAT LOGICAL*1 OK, DONE REAL SC(9), R(9) INTEGER DEFSHP REAL DEFDIR COMMON /DEFLTS/ DEFSHP, DEFDIR, DEFSHD LOGICAL CLEARF, VERBOS COMMON /MESS/ CLEARF, VERBOS BYTE BLANK(80), MESBUF(60) BYTE BLUNK(2) BYTE BLUNK2(2) BYTE OBUFF(-9:+9,-9:+9), NBUFF(-9:+9,-9:+9) BYTE JUNK COMMON /BNDRY/ IXX, IYY, ID, MINID8, JUNK, OBUFF, NBUFF EQUIVALENCE (BLUNK(2), NBUFF(-9, -9)) EQUIVALENCE (BLUNK2(2), OBUFF(-9, -9)) BYTE COMMND INTEGER ME LOGICAL*1 LSTOUT INTEGER*2 IOLDTX, IOLDTY, OLDTDS, OLDTDR #SAVED TARGET SHIP PARAMS INTEGER OLDSHP COMMON /OLDSTF/ OLDSCR(MAXSHP), OLDCRS, OLDWRP, OLDEN, OLDSH, OLDX, OLDY, IOLDT, IOLDH, IOLDP, OLDDIR, OLDSHP, IOTSHP, IOLDTX, IOLDTY LOGICAL*1 DEFALT #USE DEFAULTS AUTOMATICALLY ON MOST COMMANDS # LOWERCASE COMMANDS USE AUTO DEFAULTS DEFALT = (COMMND>='a') & (COMMND<='z') IF ( DEFALT ) COMMND = COMMND + ('A'-'a') SWITCH ( COMMND ) [ CASE 'L', 'I', '.': # LONG RANGE SCAN COMMAND IF ( DEFALT ) [ ITSHP = DEFSHP OK = .TRUE. ] ELSE CALL GETINT('TARGET SHIP? ',ITSHP,OK,1,8,DEFSHP) IF (OK) [ IF ( ITSHP != IOTSHP ) [ DEFSHP = ITSHP #UPDATE DEFAULT SHIP IOTSHP = ITSHP CALL TPOS(13,78) ENCODE(1, 1101, MESBUF) ITSHP 1101 FORMAT(I1) CALL OUTCH(MESBUF, 1) #DISPLAY TARGET SHIP # CALL TPOS(14,70) CALL OUTCH(SHPNAM(1,ITSHP),10) #DISPLAY TARGET SHIP NAME CALL OUTCH(0, -1) ] IF ( CLOAK(ITSHP) ) [ #CAN'T LOCATE CLOAKED SHIPS CALL MESSGE( 'TARGET NOT VISIBLE!' ) BREAK ] IX=XCORD(ITSHP)/10. IY=YCORD(ITSHP)/10. IF ( (IX!=IOLDTX) | (IY!=IOLDTY) ) [ IOLDTX = IX IOLDTY = IY CALL TPOS(17,75) #DISPLAY TARGET SECTOR ENCODE(5, 1071, MESBUF) IX, IY 1071 FORMAT(I2,',',I2) CALL OUTCH(MESBUF, 5) ] CALL DIRDIS( XCORD(ME), YCORD(ME), XCORD(ITSHP), YCORD(ITSHP), EDIR, EDIS ) EDIRC = CLKDIR( EDIR ) #CONVERT TO CLOCK FACE DIRECTION IF ( EDIS != OLDTDS ) [ OLDTDS = EDIS CALL TPOS(16,75) ENCODE(5, 1081, MESBUF) EDIS 1081 FORMAT(F5.2) CALL OUTCH(MESBUF, 5) #DISPLAY TARGET DISTANCE ] IF ( EDIRC != OLDTDR ) [ OLDTDR = EDIRC CALL TPOS(15,75) ENCODE(5, 1091, MESBUF) EDIRC 1091 FORMAT(F5.2) CALL OUTCH(MESBUF, 5) #DISPLAY TARGET DIRECTION ] IF ( COMMND=='I' ) [ # SET DEFAULT DIRECTION TO TORP INTERSECT COURSE CALL INTERS( EDIR, DIR(ITSHP), WARP(ITSHP), 10., DIRINT ) DEFDIR = CLKDIR( DIRINT ) ] ELSE [ DEFDIR = EDIRC ] ] CASE 'T': # TORPEDO COMMAND IF ( CLOAK(ME) ) [ CALL MESSGE('CLOAKED!') BREAK ] IF (LAUNCH(ME) < 0.) [ IF (TORPS(ME) > 0) [ IF ( DEFALT ) [ VALUE = DEFDIR OK = .TRUE. ] ELSE CALL GETREL('TORPEDO COURSE? ',VALUE,OK,0.,12.,DEFDIR) IF (OK) [ DEFDIR = VALUE LAUNCH(ME) = DEGDIR( VALUE ) TORPS(ME)=TORPS(ME)-1 IF (TORPS(ME) == 0) [ CALL MESSGE('LAST TORPEDO!') ] ] ] ELSE [ CALL MESSGE('NO TORPEDOES!') ] ] ELSE [ CALL MESSGE('TORPEDOES NOT READY') ] CASE 'P': # PHASER COMMAND IF ( CLOAK(ME) ) [ CALL MESSGE('CLOAKED!') BREAK ] IF (PHA(ME) < 0.) [ IF ( DEFALT ) [ VALUE = DEFDIR OK = .TRUE. ] ELSE CALL GETREL('PHASER COURSE? ',VALUE,OK,0.,12.,DEFDIR) IF (OK) [ DEFDIR = VALUE PHA(ME) = DEGDIR( VALUE ) ENERGY(ME)=ENERGY(ME)-50. ] ] ELSE [ CALL MESSGE('PHASERS NOT READY') ] CASE 'K': # HOMING TORPEDO LAUNCH IF ( CLOAK(ME) ) [ CALL MESSGE('CLOAKED!') BREAK ] LSTOUT = .TRUE. IF ( NHOM(ME) < MAXHOM ) [ DO IH = 1, MAXHOM [ IF ( WHOM(ME,IH) < 0 ) [ LSTOUT = .FALSE. #LAST LAUNCH NOT DONE BREAK ] ] ] IF (LSTOUT) [ IF (NHOM(ME) > 0) [ IF ( DEFALT ) [ ITSHP = DEFSHP OK = .TRUE. ] ELSE CALL GETINT('TARGET SHIP? ',ITSHP,OK,1,8,DEFSHP) IF (OK) [ DEFSHP = ITSHP IF (ITSHP == ME) [ CALL MESSGE('TORPEDOES JAMMED!') NHOM(ME)=0 TORPS(ME)=0 ] ELSE [ DO IH = 1, MAXHOM [ IF ( WHOM(ME,IH) == 0 ) [ #FIND AN IDLE HOMER WHOM(ME,IH) = -ITSHP #SET TO LAUNCH @ ITSHP NHOM(ME)=NHOM(ME)-1 BREAK ] ] ] ] ] ELSE [ CALL MESSGE('NO HOMERS!') ] ] ELSE [ CALL MESSGE('HOMERS NOT READY') ] CASE 'W': # WARP FACTOR COMMAND CALL GETREL('WARP SIR? ',VALUE,OK,0.,8.,WARP(ME)) IF (OK) [ WARP(ME)=VALUE ] # MIDDLE KEYPAD DIGIT IS MAX WARP CASE '5': WARP(ME) = 8.0 # THE FOLLOWING CODE IS FOR NEW DEFAULTS LCW 22-JUN-82 # KEYPAD 0 IS DEAD STOP CASE '0': WARP(ME) = 0.0 # KEYPAD - IS DECREASE SPEED CASE '-': IF (WARP(ME) > 0.0)[ WARP(ME) = WARP(ME) - 1.0 IF (WARP(ME) < 0.0)[ WARP(ME) = 0.0 ] ] # KEYPAD , IS INCREASE SPEED CASE ',': IF (WARP(ME) < 8.0)[ WARP(ME) = WARP(ME) + 1.0 IF (WARP(ME) > 8.0)[ WARP(ME) = 8.0 ] ] # END OF NEW DEFAULTS BY LCW 22-JUN-82 CASE 'C': # COURSE COMMAND CALL GETREL('COURSE SIR? ',VALUE,OK,0.,12.,DEFDIR) IF (OK) [ DIR(ME) = DEGDIR( VALUE ) ] # DIGITS 1 - 9 ON KEYPAD ARE COURSE CHANGES # # 7 8 9 # 4 6 # 1 2 3 # CASE '1': DIR(ME) = 225.0 CASE '2': DIR(ME) = 270.0 CASE '3': DIR(ME) = 315.0 CASE '4': DIR(ME) = 180.0 CASE '6': DIR(ME) = 0.0 CASE '7': DIR(ME) = 135.0 CASE '8': DIR(ME) = 90.0 CASE '9': DIR(ME) = 45.0 CASE 'X': # EXPLODE ANTI-MATTER DEVICE IF (IPODST(ME) == 2) [ IPODST(ME)=3 CALL MESSGE('DETONATION SIGNALED') ] ELSE [ CALL MESSGE('NO POD!') ] CASE 'N': # CONVERT MOVING ANTI-MATTER POD TO A STATIC MINE IF (IPODST(ME) == 2) [ WPOD(ME)=0. CALL MESSGE('POD POSITIONED') ] ELSE [ CALL MESSGE('NO POD!') ] CASE 'Z': # LAUNCH ANTI-MATTER DEVICE IF ( CLOAK(ME) ) [ CALL MESSGE('CLOAKED!') BREAK ] IF ( (IPODST(ME)==0) | (IPODST(ME)==4) ) [ IF ( DEFALT ) [ VALUE = DEFDIR OK = .TRUE. ] ELSE CALL GETREL('POD COURSE? ',VALUE,OK,0.,12.,DEFDIR) IF (OK) [ DEFDIR = VALUE DPOD(ME) = DEGDIR( VALUE ) # TAKES ENERGY TO CREATE A NEW POD IF ( IPODST(ME)==4 ) ENERGY(ME) = ENERGY(ME)-500.0 IPODST(ME)=1 ] ] ELSE [ CALL MESSGE('NO POD!') ] CASE 'H': # SET HYPERSPACE PORT COMMAND IUNIQ = HYPER(ME) CALL GETINT('HYPER PORT? ',IPORT,OK,1,6,IUNIQ) IF (OK) [ HYPER(ME)=IPORT ] CASE 'S': # SHIELD COMMAND IF ( DEFALT ) [ VALUE = DEFSHD OK = .TRUE. ] ELSE CALL GETREL('ENERGY CHANGE? ',VALUE,OK,-1.E36,1.E36,DEFSHD) IF (OK) [ IF (ENERGY(ME)-VALUE >= 0. & SHIELD(ME)+VALUE >= 0.) [ ENERGY(ME)=ENERGY(ME)-VALUE SHIELD(ME)=SHIELD(ME)+VALUE IF (VALUE.GE.0.0) DEFSHD = VALUE ] ELSE [ CALL MESSGE('?! IMPOSSIBLE !?') ] ] CASE 'E': # FLIP ENERGY NET ON OR OFF NET(ME) = !NET(ME) CASE 'B': # TRACTOR BEAM CALL GETINT('BEAM TARGET? ',ITSHP,OK,0,8,DEFSHP) IF (OK) [ IF (ITSHP != 0) [ IF ( CLOAK(ITSHP) ) [ CALL MESSGE( 'TARGET NOT VISIBLE!' ) BREAK ] DEFSHP = ITSHP ] IF (ITSHP == ME) CALL MESSGE('? HUH ?') ELSE TRBEAM(ME) = ITSHP ] CASE 'F': # CLOAKING COMMAND IF (! CLOAK(ME)) [ CLOAK(ME)=.TRUE. ] ELSE [ CALL MESSGE('ALREADY CLOAKED!') ] CASE 'A': # APPEAR COMMAND IF (CLOAK(ME)) [ CLOAK(ME)=.FALSE. ] ELSE [ CALL MESSGE('NOT CLOAKED!') ] CASE 'V': # FLIP VERBOSE MESSAGES ON OR OFF VERBOS = !VERBOS CASE 'R': # REFRESH COMMAND CALL STRMOV(BLUNK2,1,361,OBUFF,1) CALL RBUFF CALL CLROLD #SCRAMBLE SAVED STUFF SO IT REFRESHES CASE 'M': # MESSAGE COMMAND CALL GETINT('UHURA HERE, TO WHOM? ',IVAL,OK,0,8,DEFSHP) IF (OK) [ IF (IVAL != 0) [ IL = IVAL IH = IVAL ] ELSE [ IL = 1 IH = 8 ] CALL TPOS(24,1) CALL OUTCH(BLANK, 79) CALL TPOS(24,1) CALL OUTSTR(.FALSE., 'MESSAGE CAPTAIN? ', .FALSE.) CALL INCHAR(MESBUF(2), 59, .TRUE., -1, NC, IERR) CALL TPOS(1, 1) CALL OUTCH(0, 0) IF (IERR >= 0 & NC > 0) [ MESBUF(1) = ME+DIG0 DO I = NC+2, 59 MESBUF(I) = ' ' DO I = IL, IH IF (SHPACT(I)) [ CALL STRMOV(MESBUF,1,60,MESSAG,I*60-59) ] ] ] CASE 'Q': # QUIT COMMAND CALL YESNO('QUIT NOW? ',DONE) CASE '?': # HELP COMMAND CALL TPOS(19,1) CALL OUTSTR(.FALSE., 'A APPEAR (CLOAKING OFF) M SEND MESSAGE T FIRE TORPEDOES', .TRUE.) CALL OUTSTR(.TRUE., 'C COURSE HEADING N FREEZE ANTI-MATTER W SET WARP SPEED', .TRUE.) CALL OUTSTR(.TRUE., 'F FADE (CLOAKING ON) P FIRE PHASERS X DETONATE ANTI-MATTER', .TRUE.) CALL OUTSTR(.TRUE., 'H HYPERSPACE SETTING Q QUIT Z LAUNCH ANTI-MATTER', .TRUE.) CALL OUTSTR(.TRUE., 'K FIRE HOMING TORPEDO R RESET DISPLAY V VERBOSE ON/OFF', .TRUE.) CALL OUTSTR(.TRUE., 'L LOCATE SHIP S SHIELD CHANGE E ENERGY NETS ON/OFF', .TRUE.) CALL TPOS(1,1) CALL OUTCH(0,0) CASE 'D': # CHANGE DEFAULT SHIP CALL GETINT('DEFAULT SHIP? ',ITSHP,OK,1,8,DEFSHP) IF ( OK ) DEFSHP = ITSHP CASE ' ': # DO NOTHING DEFAULT: # ERROR CALL MESSGE('?! WHAT !?') ] RETURN END # SCREW UP SAVED OLD STUFF SO IT REFRESHES SUBROUTINE CLROLD PARAMETER MAXSHP = 8 INTEGER*2 IOLDTX, IOLDTY, OLDTDS, OLDTDR #SAVED TARGET SHIP PARAMS INTEGER OLDSHP COMMON /OLDSTF/ OLDSCR(MAXSHP), OLDCRS, OLDWRP, OLDEN, OLDSH, OLDX, OLDY, IOLDT, IOLDH, IOLDP, OLDDIR, OLDSHP, IOTSHP, IOLDTX, IOLDTY DO I=1,MAXSHP OLDSCR(I)= -1E-10 #DISPLAYED SCORES OLDEN = -1.0 #ENERGY OLDSH = -1.0 #SHIELDS OLDCRS= -1.0 #COURSE OLDWRP= -1.0 #WARP OLDX = -1.0 #X COORD OLDY = -1.0 #Y COORD IOLDT= -1 # TORPS IOLDH= -1 # HOMERS IOLDP= 0 # HYPER PORT OLDSHP = 0 #DEFAULT SHIP OLDDIR = -1.0 #DEFAULT DIRECTION IOTSHP = 0 #TARGET SHIP IOLDTX = -1 #TARGET X SECTOR IOLDTY = -1 #TARGET Y SECTOR RETURN END