-+-+-+-+-+-+-+-+ START OF PART 7 -+-+-+-+-+-+-+-+ X _ %REF(READ_MAILBOX),OUR.MBX_CHAN,,,,) X CALL STATUS_CHECK(STATUS) X X RETURN X END X X X SUBROUTINE WRITE_TO_MAILBOX( TEXT ) X INTEGER STATUS X INTEGER SYS$QIOW X INTEGER BUFLEN X CHARACTER*(*) TEXT, LINE*99 X INCLUDE 'BATTLE.INC' X INCLUDE '($IODEF)' X 1 FORMAT( I2,A97 ) X BUFLEN = 99 X WRITE( LINE, 1 ) ILN( TEXT ), TEXT X STATUS=SYS$QIOW(,%VAL(THEIR.MBX_CHAN),`20 X _ %VAL(IO$_WRITEVBLK+IO$M_NOW) X _ ,,,,%REF(LINE),%VAL(BUFLEN),,,,) X CALL STATUS_CHECK(STATUS) X X RETURN X END X X X SUBROUTINE WRITE_TO_MAILBOX_RAW( TEXT ) X INTEGER STATUS X INTEGER SYS$QIOW X INTEGER BUFLEN X CHARACTER*(*) TEXT, LINE*99 X INCLUDE 'BATTLE.INC' X INCLUDE '($IODEF)' X BUFLEN = LEN(TEXT) X`20 X STATUS=SYS$QIOW(,%VAL(THEIR.MBX_CHAN),`20 X _ %VAL(IO$_WRITEVBLK+IO$M_NOW) X _ ,,,,%REF(TEXT),%VAL(BUFLEN),,,,) X CALL STATUS_CHECK(STATUS) X X RETURN X END X X SUBROUTINE GET_THEIR_INFO X INTEGER STATUS,SYS$QIOW,BUFLEN X CHARACTER*99 TEXT`20 X 1 FORMAT( 1X, A12, 1X, A12, 1X, A15 ) X INCLUDE 'BATTLE.INC' X INCLUDE '($IODEF)' X X BUFLEN = 99 X TEXT = ' ' X STATUS=SYS$QIOW(,%VAL(OUR.MBX_CHAN),%VAL(IO$_READVBLK),,,, X _ %REF(TEXT),%VAL(BUFLEN),,,,) X CALL STATUS_CHECK(STATUS) X X READ( TEXT, 1 ) THEIR.MBX_NAME, THEIR.UIC, THEIR.NICKNAME X X RETURN X END X X X SUBROUTINE READ_MAILBOX X INTEGER STATUS,SYS$QIOW,BUFLEN X COMMON /SETUP/ ICOMMON_SETUP_ROW, ICOMMON_SETUP_COL X LOGICAL HIT X CHARACTER*1 CH, TCH, LOWER, CCH, UPPER X CHARACTER*99 TEXT`20 X CHARACTER*97 STRING X INCLUDE 'BATTLE.INC' X INCLUDE '($IODEF)' X X 1 FORMAT( 1X, A1, I1 ) X 2 FORMAT( 1X, I2, I2 ) X 3 FORMAT( A1, A1, I1 , I2, I2 ) X 4 FORMAT( 1X, A1, I1 , I2, I2 ) X X BUFLEN = 99 X STATUS = SYS$QIOW(,%VAL(OUR.MBX_CHAN), X _ %VAL(IO$_READVBLK+IO$M_NOW),,,, X _ %REF(TEXT),%VAL(BUFLEN),,,,) X CALL STATUS_CHECK(STATUS) X CALL FILL_VARIABLE( STRING, TEXT, II ) X XC------------------------------------------------------------------ X IF ( STRING(1:1) .EQ. '=' ) THEN ! A SENT MESSAGE X CALL ESC_7 X CALL MESSAGE( STRING(2:II) ) X INSERT_CR = .TRUE. X CALL ESC_8 X XC------------------------------------------------------------------ X ELSEIF( STRING(1:1) .EQ. '+' ) THEN ! THEIR SHIP'S STATUS`20 X READ( STRING, 1 ) CH, ISTR X CALL THEIR_UPDATE( CH, ISTR ) X X XC------------------------------------------------------------------ X ELSEIF( STRING(1:1) .EQ. 'C' ) THEN ! THEIR CURSOR IS MOVING X READ( STRING, 2 ) ITHEIR_ROW, ITHEIR_COL X IF (( .NOT. AT_COMMAND_LINE ) .AND. ( .NOT. IN_HELP )) X _ CALL SET_CURSOR( ITHEIR_ROW, ITHEIR_COL ) X X XC------------------------------------------------------------------ X ELSEIF( STRING(1:1) .EQ. 'R' ) THEN ! THEY'VE RESPONDED. X CALL SYS$WAKE(,OUR.NICKNAME(1:OUR.NICKNAME_LEN)) X `20 X XC------------------------------------------------------------------ X ELSEIF( STRING(1:1) .EQ. '-' ) THEN ! THEY'VE FINISHED SETTING V UP X IF( IM_FINISHED ) THEN `20 X CALL SYS$WAKE(,OUR.NICKNAME(1:OUR.NICKNAME_LEN))! WE'VE BEEN W VAITING FOR THEM X THEYRE_FINISHED = .TRUE. X ELSE X CALL DISPLAY_WHAT_THEYRE_DOING( 'waiting... ', X _ ICOMMON_SETUP_ROW, ICOMMON_SETUP_COL ) X THEYRE_FINISHED = .TRUE.! WE'RE STILL SETTING UP X X ENDIF X XC------------------------------------------------------------------ X ELSEIF( STRING(1:1) .EQ. '@' ) THEN ! WE HIT THEM! X CALL SYS$SETEF( 1 ) X READ( STRING, 4 ) CH, ISTR, I1, I2 X CALL MESSAGE( '-=* BLAM *=- ...whooOOOOSH! Direct hit, sir!' ) X CH = LOWER(CH) X CALL WRITE_REV_BOLD( CH, I1, I2 ) X CALL SET_CURSOR( ITHEIR_ROW, ITHEIR_COL ) X X X ELSEIF( STRING(1:1) .EQ. '#' ) THEN ! WE MISSED THEM! X READ( STRING, 4 ) CH, ISTR, I1, I2 X CALL SYS$SETEF( 1 ) X CALL MESSAGE( '*WHOOSH!* Sorry, sir; but the'// X _ ' torpedo missed.' ) X CH = LOWER(CH) X IF (( CH .EQ. '+' ) .OR. ( CH .EQ. '.' )) THEN X CALL WRITE_BOLD( CH, I1, I2 ) X X ELSE X CALL WRITE_REV_BOLD( CH, I1, I2 ) X X ENDIF X CALL SET_CURSOR( ITHEIR_ROW, ITHEIR_COL ) X XC--------------------------------------------------------------------------- V---- X ELSEIF( STRING(1:1) .EQ. 'A' ) THEN X THEY_ABORTED = .TRUE. X PLAYING = .FALSE. X CALL MESSAGE( 'Your opponent has requested the '// X _ 'cancellation of the game, sir.' ) X CALL CANCELLED_THE_GAME X XC--------------------------------------------------------------------------- V---- X ELSEIF( STRING(1:1) .EQ. '*' ) THEN X CALL THEY_WON_THE_GAME X X XC------------------------------------------------------------------ X ELSEIF( STRING(1:1) .EQ. 'F' ) THEN ! THEY'VE FIRED! X READ( STRING, 2 ) IFIRE_ROW, IFIRE_COL X TCH = M_GRID(IFIRE_ROW-1,((IFIRE_COL-35)/2)-1) X X CALL SET_CURSOR( IOUR_ROW, IOUR_COL ) X X IF ( HIT(TCH, ISTR, CCH) ) THEN !THEY HIT US! X X IF ( ISTR .EQ. 0 ) THEN X CALL MESSAGE( 'SIR! One of our ships has been '// X _ 'destroyed!' ) X ELSE X CALL MESSAGE( 'WE''VE BEEN HIT, SIR!' ) X X ENDIF X X WRITE( STRING, 3 ) '@',TCH,ISTR,IFIRE_ROW, IFIRE_COL X CALL OUR_UPDATE( TCH , ISTR ) X TCH = LOWER(TCH) X M_GRID(IFIRE_ROW-1,((IFIRE_COL-35)/2)-1) = TCH X X CALL WRITE_BOLD( TCH, IFIRE_ROW, IFIRE_COL-35 ) X CALL WRITE_TO_MAILBOX( STRING ) !TELL THEM THEY HIT US X X ELSE ! THEY MISSED US X M_GRID(IFIRE_ROW-1,((IFIRE_COL-35)/2)-1) = '+' X CALL WRITE_BOLD( '+', IFIRE_ROW, IFIRE_COL-35 ) X CALL MESSAGE( 'Sir, it is your turn.' ) X X WRITE( STRING, 3 ) '#',CCH,ISTR,IFIRE_ROW, IFIRE_COL X CALL WRITE_TO_MAILBOX( STRING ) ! TELL THEM THEY MISSED U VS X X ENDIF X X CALL SYS$WAKE(,OUR.NICKNAME(1:OUR.NICKNAME_LEN))! WE'VE BEEN WAITI VNG FOR THEM X CALL DISPLAY_WHAT_THEYRE_DOING( 'watching our target ', X _ IOUR_ROW, IOUR_COL ) X CALL DISPLAY_WHAT_WERE_DOING ( 'aiming to fire ', X _ IOUR_ROW, IOUR_COL ) X X THEIR_TURN = .FALSE. X X ENDIF X X CALL SET_WRITE_ATTENTION X X RETURN X END X X X X CHARACTER*1 FUNCTION LOWER( CH ) X CHARACTER*1 CH X II = ICHAR( CH )`20 X IF (II .GE. 65 .AND. II .LE. 90) II = II + 32 X LOWER = CHAR(II) X RETURN X END X `20 X X CHARACTER*1 FUNCTION UPPER( CH ) X CHARACTER*1 CH X II = ICHAR( CH )`20 X IF (II .GE. 65 .AND. II .LE. 90) II = II - 32 X UPPER = CHAR(II) X RETURN X END X `20 X X LOGICAL FUNCTION HIT( CH, II , CCH ) X CHARACTER*1 CH, CCH X INCLUDE 'BATTLE.INC' X INT = ICHAR(CH) X X IF ( CH .EQ. '.' ) THEN X HIT = .FALSE. X CCH = '+' X RETURN X X ELSEIF (INT .GE. 97 .AND. INT .LE. 122) THEN X HIT = .FALSE. X CCH = CH X RETURN X X ELSE X IF ( CH .EQ. 'B' ) THEN X OUR.BATTLESHIP = OUR.BATTLESHIP- 1 X II = OUR.BATTLESHIP X HIT = .TRUE. X X ELSEIF( CH .EQ. 'A' ) THEN X OUR.CARRIER = OUR.CARRIER - 1 X II = OUR.CARRIER X HIT = .TRUE. X X ELSEIF( CH .EQ. 'D' ) THEN X OUR.DESTROYER = OUR.DESTROYER - 1 X II = OUR.DESTROYER X HIT = .TRUE. X X ELSEIF( CH .EQ. 'C' ) THEN X OUR.CRUISER = OUR.CRUISER - 1 X II = OUR.CRUISER X HIT = .TRUE. X X ELSEIF( CH .EQ. 'S' ) THEN X OUR.SUBMARINE = OUR.SUBMARINE - 1 X II = OUR.SUBMARINE X HIT = .TRUE. X X ELSEIF( CH .EQ. 'P' ) THEN X OUR.PT_BOAT = OUR.PT_BOAT - 1 X II = OUR.PT_BOAT X HIT = .TRUE. X X ELSE X CCH = CH X HIT = .FALSE. X X ENDIF X X ENDIF X RETURN X END X X SUBROUTINE FILL_VARIABLE( STRING, TEXT, II ) X 1 FORMAT( I2, A97 ) X CHARACTER*99 TEXT X CHARACTER*97 STRING X READ( TEXT, 1 ) II,STRING X CALL LEFT_JUSTIFY( STRING ) X RETURN X END X X X SUBROUTINE WRITE_SYSOUTPUT_RAW( TEXT ) X CHARACTER*(*) TEXT X INTEGER STATUS, SYS$QIOW, SYS$ASSIGN, OUTPUT_CHANNEL, BUFLEN X COMMON /SYSTEM_SERVICES/ MULTI_EXEC, INPUT_CHANNEL,`20 X _ OUTPUT_CHANNEL X LOGICAL MULTI_EXEC/.FALSE./ X INCLUDE 'BATTLE.INC' X INCLUDE '($IODEF)' X BUFLEN = LEN(TEXT) X X IF (.NOT.MULTI_EXEC) THEN X STATUS = SYS$ASSIGN('SYS$INPUT',INPUT_CHANNEL,,,,) X CALL STATUS_CHECK( STATUS ) X X STATUS = SYS$ASSIGN('SYS$OUTPUT',OUTPUT_CHANNEL,,,,) X CALL STATUS_CHECK( STATUS ) X MULTI_EXEC = .TRUE. X ENDIF X X STATUS=SYS$QIOW(,%VAL(OUTPUT_CHANNEL),%VAL(IO$_WRITEVBLK+IO$M_NOW) X _ ,,,,%REF(TEXT),%VAL(BUFLEN),,,,) X CALL STATUS_CHECK( STATUS ) X X RETURN X END X X X SUBROUTINE PURGE_TYPE_AHEAD X INTEGER STATUS, SYS$QIOW, SYS$ASSIGN, OUTPUT_CHANNEL X COMMON /SYSTEM_SERVICES/ MULTI_EXEC, INPUT_CHANNEL,`20 X _ OUTPUT_CHANNEL X LOGICAL MULTI_EXEC/.FALSE./ X INCLUDE '($IODEF)' X X IF (.NOT.MULTI_EXEC) THEN X STATUS = SYS$ASSIGN('SYS$INPUT',INPUT_CHANNEL,,,,) X CALL STATUS_CHECK( STATUS ) X X STATUS = SYS$ASSIGN('SYS$OUTPUT',OUTPUT_CHANNEL,,,,) X CALL STATUS_CHECK( STATUS ) X MULTI_EXEC = .TRUE. X ENDIF X X STATUS = SYS$QIOW(,%VAL(INPUT_CHANNEL), X _ %VAL(IO$_READVBLK+IO$M_PURGE),,,,,,,,,) X CALL STATUS_CHECK( STATUS ) X X END X X X SUBROUTINE STATUS_CHECK( STATUS ) X INTEGER STATUS X CHARACTER*100 MSG X INCLUDE '($SSDEF)' X X IF (.NOT.STATUS) THEN X CALL SYS$GETMSG( %VAL(STATUS), IMSG_LEN , MSG,`20 X _ %VAL(1), ) X CALL MESSAGE( 'Error: '//MSG(1:IMSG_LEN) ) X ENDIF X X RETURN X END X X X SUBROUTINE ESC_7 X CHARACTER*1 ESC/27/ X CALL WRITE_SYSOUTPUT_RAW( ESC//'7' ) X RETURN X END X X SUBROUTINE ESC_8 X CHARACTER*1 ESC/27/ X CALL WRITE_SYSOUTPUT_RAW( ESC//'8' ) X RETURN X END X X X`09SUBROUTINE CONTROL(CHARACTER,ROUTINE) X X`09IMPLICIT INTEGER (A-Z) X X`09PARAMETER ( IO$_SETMODE = '23'X ) X`09PARAMETER ( IO$M_OUTBAND = '400'X ) X X`09CHARACTER*(*) CHARACTER X`09CHARACTER*1 C X`09INTEGER MASK(2) X`09INTEGER*2 CHAN,IOSB(4) X`09EXTERNAL ROUTINE X X`09DATA MASK / 2*0 / X X`09C = CHARACTER X X`09IF (LEN(CHARACTER).NE.1 .OR. C.EQ.'C' .OR. C.EQ.'Y' X`091`09.OR. C.LT.'A' .OR. C.GT.'Z') CALL EXIT('10000004'X) X X`09MASK(2) = ISHFT(1,ICHAR(C)-ICHAR('A')+1) X X`09STATUS = SYS$ASSIGN('TT',CHAN,,)`09! Must assign new channel for X`09`09`09`09`09`09! `09 each call to CONTROL X`09IF (.NOT.STATUS) CALL LIB$STOP(%VAL(STATUS)) X X`09STATUS = SYS$QIOW(,%VAL(CHAN),%VAL(IO$_SETMODE+IO$M_OUTBAND), X`091`09`09`09`09`09IOSB,,,ROUTINE,MASK,,,,) X X`09IF (.NOT.STATUS) CALL LIB$STOP(%VAL(STATUS)) X X`09IF (.NOT.IOSB(1)) CALL LIB$STOP(%VAL(IOSB(1))) X X`09END X X $ CALL UNPACK SYSTEM.FOR;1 2066045931 $ create 'f' X******************************************** XC FUNCTION TIME_OKAY`20 XC RETURNS TRUE IF IT'S A VALID TIME FOR PLAYING XC OR PLAYER HAS PRIVELEGE TO PLAY DURING OFF HOURS XC ELSE XC RETURNS FALSE TO CALLING PROGRAM XC XC AUTHOR: CLIFFORD MOON XC SITE: UT-PANAM XC DATE: 09/14/89 `20 XC X LOGICAL FUNCTION TIME_OKAY(IDUMMY) X X CHARACTER*120 CURRENT_IMAGE_NAME X CHARACTER*120 FILENAME X CHARACTER*10 BATTLE_TIME(24) X CHARACTER*20 DUMMY_LINE X CHARACTER*2 HOUR,GET_HOUR X CHARACTER AUTH_CHAR X INTEGER `09TODAY,LN,DAY_OF_WEEK X PARAMETER `09JPI$IMAGNAME = '00000207'X X X TIME_OKAY = `09.TRUE. X TODAY =`09DAY_OF_WEEK(IDUMMY) X X CALL GET_JPI(JPI$IMAGNAME,CURRENT_IMAGE_NAME,IDUMMY) X X I = INDEX(CURRENT_IMAGE_NAME,'`5D') X X FILENAME = CURRENT_IMAGE_NAME(1:I)//'BATTLESHIP_TIMES.DAT' X II = ILN(FILENAME) X FILENAME = FILENAME(1:II) X X OPEN ( X - UNIT = 5, X - STATUS = 'OLD', X - ERR = 4, X - FILE = FILENAME) X X READ ( X - 5, X - FMT = '(A10)', X - ERR = 4, X - END = 5) DUMMY_LINE X X INSIDE = .TRUE. X III = 1 X X DO WHILE (INSIDE) X READ ( X - 5, X - FMT = '(A10)', X - ERR = 5, X - END = 5) BATTLE_TIME(III) X III = III + 1 X ENDDO X`20 X 5 CLOSE(5) X INSIDE = .FALSE. X X HOUR = GET_HOUR(IDUMMY) X CALL CCTI(HOUR,IHOUR) X IHOUR = IHOUR + 1 X X AUTH_CHAR = BATTLE_TIME(IHOUR)(TODAY:TODAY) X X IF (AUTH_CHAR .NE. '.') TIME_OKAY = .FALSE. X RETURN X X 4 TIME_OKAY = .TRUE. X RETURN X END X X X `20 XC RETURN THE CURRENT HOUR XC 00 - 23 HOURS XC XC X`20 X CHARACTER*2 FUNCTION GET_HOUR(IDUMMY) X +-+-+-+-+-+-+-+- END OF PART 7 +-+-+-+-+-+-+-+-