PROGRAM CNTPED # # THIS IS THE MAIN CONTROL PROGRAM FOR CENTIPEDE. # ############################################################################# # # # AUTHOR: GLEN HOFFING # # RCA GOVERNMENT COMMUNICATIONS SYSTEMS # # FRONT AND COOPER STS. # # CAMDEN, NJ 08102 # # # # DATE: 06-MAY-82 # # # ############################################################################# # IMPLICIT INTEGER (A-Z) EXTERNAL *INPAST,*CNTRLC INCLUDE SY:CNTPED.CMN INCLUDE SY:UVT100.DAT REAL SECNDS,RAN,TIMX BYTE NOWRAP(2) % DATA NOWRAP / "24,0 / CALL TIMCHK #CHECK LEGAL GAME-PLAYING TIME # # GENERATE THE SEED FOR PSEUDO-RANDOM NUMBER GENERATOR # TIMX = SECNDS(0.) SEED = (TIMX / 100) SEED = SEED * 100 SEED = (TIMX - SEED + 1) * 10000 # # INITIALIZE # GUNCNT = 3 #INITIAL GUN COUNT CYCTIM = 6 #CYCLE TIME IN CLOCK TICKS FRESCO = 12000 #SCORE AT WHICH GET FREE GUN TMREFN = 1 #MARK TIME EVENT FLAG OLDSCO = -1 OLDCNT = -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,5) #SET SCREEN TO WHITE ON BLACK CALL UVT100(RM,7) #DISABLE VT100 AUTOWRAPAROUND CALL UVT100(SM,8) #ENABLE VT100 AUTOREPEAT CALL UVT100(SCS,0,1) #LOAD STANDARD CHARACTER SET CALL UVT100(SCS,1,2) #LOAD GRAPHICS CHARACTER SET CALL GETADR(PRL,OUTBUF) OUTBUF(LEN+1) = SHFOUT LEN = LEN + 1 CALL START # # 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 IF (FLETIM == 0 .AND. SCORE > 5000) FLETIM = TIMER + 10 #SCHEDULE FIRST FLEA IF (SCOTIM == 0 .AND. SCORE > 10000) SCOTIM = TIMER + 10 #SCHEDULE FIRST SCORPION CALL GUNMOV #MOVE GUN AS DIRECTED IF (FIRCOD > 0) CALL FIRE #FIRE GUN AS DIRECTED IF (BULACT == 1) CALL BULLET #CONTROL FIRED BULLET # # SET DIFFICULTY LEVEL BASED ON CURRENT SCORE # DIFF = (SCORE / 12000) + 1 # # CONTROL ATTACKING CREATURES # IF ((DIFF == 1 .AND. (TIMER/3)*3 == TIMER) .OR. (DIFF == 2 .AND. (TIMER/2)*2 == TIMER) .OR. (DIFF == 3 .AND. (TIMER/3)*3 != TIMER) .OR. (DIFF == 4 .AND. (TIMER/6)*6 != TIMER) .OR. DIFF > 4) [ CALL CNTMOV #CENTIPEDES IF (FIRCOD > 0) CALL FIRE IF (BULACT == 1) CALL BULLET ] IF (FLEACT == 1) [ CALL FLEA #FLEA IF (FIRCOD > 0) CALL FIRE IF (BULACT == 1) CALL BULLET ] IF (SPIACT == 1) [ IF ((DIFF == 1 .AND. (TIMER/3)*3 == TIMER) .OR. (DIFF == 2 .AND. (TIMER/2)*2 == TIMER) .OR. (DIFF == 3 .AND. (TIMER/3)*3 != TIMER) .OR. (DIFF == 4 .AND. (TIMER/6)*6 != TIMER) .OR. DIFF > 4) [ CALL SPIDER #SPIDER IF (FIRCOD > 0) CALL FIRE IF (BULACT == 1) CALL BULLET ] ] IF (SCOACT == 1 .AND. (TIMER/2)*2 == TIMER) [ CALL SCORPI #SCORPION IF (FIRCOD > 0) CALL FIRE IF (BULACT == 1) CALL BULLET ] # # CHECK FOR COLLISION WITH GUN # CALL COLIDE # # RELEASE ANY NEW CREATURES WHOSE TIME HAS COME # CALL RELEAS # # CHECK FOR ALL CENTIPEDES DESTROYED OR REACHED BOTTOM OF SCREEN # ITMP = 0 JTMP = 0 DO I = 1,MAXCNT [ #SEARCH CENTIPEDE TABLE IF (CLEN(I) == 0) NEXT #INACTIVE ITMP = 1 #ACTIVE IF (CBOT(I) == 0) JTMP = 1 #HAS NOT REACHED BOTTOM OF SCREEN ] IF (ITMP == 0 .AND. CNTWAV == 0) [ #ALL CENTIPEDES ARE DESTROYED CALL START #NEW BOARD NEXT ] IF (JTMP == 0 .AND. CNTTIM == 0) CNTTIM = TIMER + 20 #START NEW CENTIPEDE TIMER # # DISPLAY UPDATED SCORE # IF ((TIMER/10)*10 == TIMER) [ #DISPLAY EVERY TENTH CYCLE IF (SCORE != OLDSCO) [ CALL UVT100(CUP,2,33) ENCODE(7,200,OUTBUF(LEN+1)) SCORE LEN = LEN + 7 OLDSCO = SCORE IF (SCORE >= FRESCO) [ #CHECK IF TIMER FOR A FREE GUN FRESCO = FRESCO + 12000 GUNCNT = GUNCNT + 1 ] ] IF (GUNCNT != OLDCNT) [ #DISPLAY NUMBER OF GUNS REMAINING CALL UVT100(CUP,24,34) OUTBUF(LEN+1) = "G" OUTBUF(LEN+2) = "U" OUTBUF(LEN+3) = "N" OUTBUF(LEN+4) = "S" OUTBUF(LEN+5) = ":" LEN = LEN + 5 ENCODE(2,300,OUTBUF(LEN+1)) GUNCNT-1 LEN = LEN + 2 OLDCNT = GUNCNT ] ] CALL GETADR(PRL,OUTBUF) PRL(2) = LEN CALL WTQIO(IOWVB,5,2,,,PRL) LEN = 0 CALL WAITFR(TMREFN) #WAIT FOR END OF THIS CYCLE ] UNTIL (DIRCOD == -1) #PLAYER REQUEST TO END GAME OUTBUF(LEN+1) = SHFIN LEN = LEN + 1 CALL UVT100(ED,2) #ERASE SCREEN CALL UVT100(CUP,1,1) #HOME CURSOR CALL GETADR(PRL,OUTBUF) PRL(2) = LEN CALL WTQIO(IOWVB,5,2,,,PRL) CALL EXIT #EXIT TASK 100 FORMAT (A1) 200 FORMAT (I7) 300 FORMAT (I2) END