PROGRAM MISSIL # # THIS IS THE MAIN CONTROL PROGRAM FOR MISSILE COMMANDER. # ############################################################################# # # # AUTHOR: GLEN HOFFING # # RCA GOVERNMENT COMMUNICATIONS SYSTEMS # # FRONT AND COOPER STS. # # CAMDEN, NJ 08102 # # # # DATE: 27-APR-82 # # # ############################################################################# # IMPLICIT INTEGER (A-Z) EXTERNAL *INPAST,*CNTRLC INCLUDE SY:MISSIL.CMN INCLUDE SY:UVT100.DAT REAL SECNDS,RAN,TIMX DIMENSION WAVTIM(24),AIRWVX(24) BYTE NOWRAP(2) DATA SITENM / 0,0,1,1,0,0,2,2,2,0,3,3,3,0,4,4,4,0,0,5,5,0,0,6,6,6, 0,7,7,7,0,8,8,8,0,0,9,9,0,0 / DATA LN21 / 2*SPACE,ULCOR,URCOR,15*SPACE,ULCOR,URCOR,15*SPACE, ULCOR,URCOR,2*SPACE / DATA LN22 / SPACE,ULCOR,LRCOR,LLCOR,URCOR,SPACE,ULCOR,TDOWN,URCOR, SPACE,ULCOR,TDOWN,URCOR,SPACE,ULCOR,TDOWN,URCOR,SPACE, ULCOR,LRCOR,LLCOR,URCOR,SPACE,ULCOR,TDOWN,URCOR,SPACE, ULCOR,TDOWN,URCOR,SPACE,ULCOR,TDOWN,URCOR,SPACE,ULCOR, LRCOR,LLCOR,URCOR,SPACE / DATA LN23 / HORIZ,TUP,2*HORIZ,TUP,HORIZ,TUP,HORIZ,TUP,HORIZ,TUP,HORIZ, TUP,HORIZ,TUP,HORIZ,TUP,HORIZ,TUP,2*HORIZ,TUP,HORIZ,TUP, HORIZ,TUP,HORIZ,TUP,HORIZ,TUP,HORIZ,TUP,HORIZ,TUP,HORIZ, TUP,2*HORIZ,TUP,HORIZ / DATA LN24 / 80*SPACE / DATA WAVTIM / 6,6,6,5,5,5,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,2,2,2 / DATA AIRWVX / 4*7,4*8,4*9,4*10,4*11,4*12 / % DATA NOWRAP / "24,0 / DATA STATE / 9*1 / # # GENERATE THE SEED FOR PSEUDO-RANDOM NUMBER GENERATOR # TIMX = SECNDS(0.) SEED = (TIMX / 10) SEED = SEED * 10 SEED = (TIMX - SEED + 1) * 10000 # # INITIALIZE # CYCTIM = 8 #CYCLE TIME IN CLOCK TICKS FRESCO = 10000 #SCORE AT WHICH GET FREE CITY TMREFN = 1 CALL GETADR(PRL,NOWRAP) #SET VT100 TO NO WRAPAROUND PRL(2) = 2 CALL WTQIO(SFSMC,5,2,,,PRL) OPEN (UNIT=5,CARRIAGECONTROL='NONE') CALL GETADR(PRL(1),INPAST) #ATTACH VT100 WITH PRL(2) = 0 #AST RECOGNITION CALL GETADR(PRL(3),CNTRLC) CALL WTQIO(IOATA,5,2,,,PRL) PRL(2) = 1 PRL(3) = 0 CALL UVT100(ANSI) #SET VT100 TO ANSI MODE CALL UVT100(RM,8) #DISABLE AUTOREPEAT CALL UVT100(RM,5) #SET SCREEN TO WHITE ON BLACK CALL UVT100(SCS,0,1) #LOAD STANDARD CHARACTER SET CALL UVT100(SCS,1,2) #LOAD GRAPHICS CHARACTER SET CALL GETADR(PRL,SHFOUT) #SELECT GRAPHICS SET CALL WTQIO(IOWVB,5,2,,,PRL) CALL START #INITIALIZE FIRST WAVE # # MAIN CONTROL LOOP. ONLY EXIT FROM THIS LOOP IS GAME # ENDING OR PLAYER TYPING CONTROL-C. # REPEAT [ #LOOP EVERY CYCTIM CLOCK TICKS CALL MARK(TMREFN,CYCTIM,1) TIMER = TIMER + 1 # # CHECK TO SEE IF CURRENT WAVE IS STILL ACTIVE # ITMP = 0 #WILL BE SET IF WAVE STILL ACTIVE DO I = 1,24 [ #CHECK FOR ACTIVE BOMBS IF (BMBACT(I) != 0) [ ITMP = 1 BREAK ] ] DO I = 1,12 [ #CHECK FOR ACTIVE SMART BOMBS IF (SMBACT(I) != 0) [ ITMP = 1 BREAK ] ] IF (AIRACT == 1) #CHECK FOR AIRPLANE ITMP = 1 DO I = 1,30 [ #CHECK FOR EXPLODING MISSILES IF (MSLACT(I) != 0) [ ITMP = 1 BREAK ] ] DO I = 1,9 [ #CHECK FOR EXPLODING SITES IF (STATE(I) == 2) [ ITMP = 1 BREAK ] ] IF (ITMP == 0) #ALL FIRES ARE OUT. CALL START #START NEW WAVE (OR END GAME) # # CHECK FOR AND PROCESS GUNSIGHT MOTION # CALL GUNSIT # # CHECK FOR AND PROCESS A FIRED MISSILE # IF (FIRCOD > 0) CALL FIRE # # CHECK IF TIME TO DISPLAY FINAL DESTRUCTION OF A SITE # DO I = 1,9 IF (TIMER == DSTIME(I)) CALL DSTROY(I) # # CONTROL ACTIVE FIRED MISSILES # DO I = 1,30 [ IF (MSLACT(I) == 0) NEXT IF (MSLACT(I) > 0) MSLACT(I) = MSLACT(I) - 1 IF (MSLACT(I) <= 0) [ MSLACT(I) = MSLACT(I) - 1 CALL EXPLOD(MSLX(I),MSLY(I),MSLACT(I)) ] IF (MSLACT(I) == -15) MSLACT(I) = 0 ] # # CHECK IF WE HAVE DESTROYED ANY ATTACKERS WITH OUR MISSILES # DO I = 1,24 [ #CHECK ACTIVE BOMBS IF (BMBACT(I) < 0) [ IF (DSPLAY(BMBX(I),BMBY(I)) == 1) [ CALL UVT100(CUP,BMBX(I),BMBY(I)) CALL GETADR(PRL,SPACE) CALL WTQIO(IOWVB,5,2,,,PRL) BMBACT(I) = 0 SCORE = SCORE + (25 * (WAVE/2+1)) #INCREMENT SCORE IF (SCORE >= FRESCO) [ #TEST FOR NEXT FREE CITY FRECTY = FRECTY + 1 FRESCO = FRESCO + 10000 ] ] ] ] DO I = 1,12 [ #CHECK ACTIVE SMART BOMBS IF (SMBACT(I) < 0) [ IF (DSPLAY(SMBX(I),SMBY(I)) == 1) [ CALL UVT100(CUP,SMBX(I),SMBY(I)) CALL GETADR(PRL,SPACE) CALL WTQIO(IOWVB,5,2,,,PRL) SMBACT(I) = 0 SCORE = SCORE + (50 * (WAVE/2+1)) #INCREMENT SCORE IF (SCORE >= FRESCO) [ #TEST FOR NEXT FREE CITY FRECTY = FRECTY + 1 FRESCO = FRESCO + 10000 ] ] ] ] # # CONTROL FALLING SMART BOMBS # ITMP = WAVTIM(WAVE) #TEST FOR MOTION ON THIS CYCLE IF ((TIMER/ITMP)*ITMP == TIMER) CALL SMART # # CONTROL AIRPLANE # IF ((TIMER/200)*200 == TIMER) [ #NEW AIRPLANE ON THIS CYCLE ? AIRACT = 1 AIRX = AIRWVX(WAVE) AIRY = 1 ] IF ((TIMER/2)*2 == TIMER .AND. AIRACT == 1) #IF MOTION THIS CYCLE, CALL AIRPLN #PROCESS ACTIVE AIRPLANE # # CONTROL FALLING BOMBS # ITMP = WAVTIM(WAVE) #TEST FOR MOTION ON THIS CYCLE IF ((TIMER/ITMP)*ITMP == TIMER) CALL BOMB # # DISPLAY UPDATED SCORE # IF ((TIMER/10)*10 == TIMER) [ #DISPLAY EVERY TENTH CYCLE CALL UVT100(CUP,1,18) WRITE (5,200) SCORE ] CALL WAITFR(TMREFN) #WAIT FOR END OF THIS CYCLE ] UNTIL (CURDIR == -1) #PLAYER REQUEST TO END GAME CALL GETADR(PRL,SHFIN) #REENABLE NORMAL CHARACTER SET CALL WTQIO(IOWVB,5,2,,,PRL) CALL UVT100(SM,8) #REENABLE AUTOREPEAT CALL UVT100(ED,2) #ERASE SCREEN CALL UVT100(CUP,1,1) #HOME CURSOR CALL EXIT #EXIT TASK 100 FORMAT (A1) 200 FORMAT (I6) END