Galaxy Guard QuickBasic Game


' ***************************************
' * GALAXY GUARD, A LITTLE BIT SPACE    *
' * INVADERS, A LITTLE BIT GALAGA.      *
' * 100% CRANKED OUT BY                 *
' * BIL AND TOMMY HOOLIGAN 2019         *
' * WE ACCEPT NO RESPONSIBILITY FOR     *
' * ANYTHING YOU DO WITH THIS CODE      *
' * BUT WE SINCERELY HOPE YOU HAVE FUN  *
' ***************************************

' INSTRUCTIONS

RANDOMIZE(TIMER)
SCREEN 8
' GOOD COLORS 2,3,7,9,10,11,14,15  with 1 for background
BACKGROUND = 1
COLOR 2, BACKGROUND
INPUT "PLEASE ENTER YOUR INITIALS: ", NAME$
NAME$ = UCASE$(LEFT$(NAME$, 3))
CLS
PRINT " LEVEL 1 "
LOCATE 5, 10
PRINT "GALAXY GUARD!   TO YOUR POST!"
LOCATE 10, 10
PRINT "+===========================+"
LOCATE 11, 10
PRINT "|  INSTRUCTIONS:            |"
LOCATE 12, 10
PRINT "|  PRESS 'A' TO MOVE LEFT   |"
LOCATE 13, 10
PRINT "|  PRESS 'D' TO MOVE RIGHT  |"
LOCATE 14, 10
PRINT "|  PRESS SPACE TO SHOOT     |"
LOCATE 15, 10
PRINT "|  PRESS 'P' TO PAUSE       |"
LOCATE 16, 10
PRINT "|  PRESS 'Q' TO QUIT        |"
LOCATE 17, 10
PRINT "+===========================+"

scale$ = "CEDAGFAGBGGA"
PLAY "L16"
FOR i% = 0 TO 3
    PLAY "O" + STR$(i%)
    PLAY "X" + VARPTR$(scale$)
NEXT i%


'  INITIALIZE GAME
CLS
COUNTER = 0
LOCATE 1, 1
PRINT " LEVEL 1 "
DIM ALIEN$(4)
ALIEN$(0) = " <*> "
ALIEN$(1) = " /0\ "
ALIEN$(2) = " -&- "
ALIEN$(3) = " }@{ "
LEVEL = 1
DIM SPEED(4)
SPEED(0) = 1: SPEED(1) = 2: SPEED(2) = 3: SPEED(3) = 4
DIM ALIENROW(4)
ALIENROW(0) = 5: ALIENROW(1) = 6: ALIENROW(2) = 7: ALIENROW(3) = 8
DIM ALIENCOLM(4)
ALIENCOLM(0) = 40: ALIENCOLM(1) = 40: ALIENCOLM(2) = 40: ALIENCOLM(3) = 40
DIM ALIENCOLOR(4)
ALIENCOLOR(0) = 3: ALIENCOLOR(1) = 7: ALIENCOLOR(2) = 9: ALIENCOLOR(3) = 10
DIM ALIENDIR$(4)
ALIENDIR$(0) = "R": ALIENDIR$(1) = "R": ALIENDIR$(2) = "R": ALIENDIR$(3) = "R"
DIM ALIENSCORE(4)
ALIENSCORE(0) = 100: ALIENSCORE(1) = 75: ALIENSCORE(2) = 50: ALIENSCORE(3) = 25
DIM BOMBCOL(4)
BOMBCOL(0) = -1: BOMBCOL(1) = -1: BOMBCOL(2) = -1: BOMBCOL(3) = -1
DIM BOMBROW(4)
BOMBROW(0) = -1: BOMBROW(1) = -1: BOMBROW(2) = -1: BOMBROW(3) = -1
DIM BOMBFIRED$(4)
BOMBFIRED$(0) = "N": BOMBFIRED$(1) = "N": BOMBFIRED$(2) = "N": BOMBFIRED$(3) = "N"

DIM DEG(5)
DEG(0) = 0: DEG(1) = 3240: DEG(2) = 3600: DEG(3) = 1800: DEG(4) = 2160
POINTS = 70
DIM ALIENDEG(4)
ALIENDEG(0) = 0: ALIENDEG(1) = 0: ALIENDEG(2) = 0: ALIENDEG(3) = 0
DIM LASTCOL(4)
LASTCOL(0) = 5: LASTCOL(1) = 5: LASTCOL(2) = 5: LASTCOL(3) = 5
DIM LASTROW(4)
LASTROW(0) = 2: LASTROW(1) = 2: LASTROW(2) = 2: LASTROW(3) = 2

TEMPROW = 0
TEMPCOL = 0
BOMBRANDO = 2
BOMBSCOPE = 200
DIM PLAYERSCORE(12)
DIM PLAYERINITIAL$(12)
FOR X = 0 TO 11
    PLAYERSCORE(X) = 0
    PLAYERINITIAL$(X) = ""
NEXT X

' INITIALIZE PLAYER

LIVESCOUNT = 3
GAMEOVER$ = "N"
PLAYERCOLM = 40
FIRING$ = "N"
SHOTROW = 22
SHOTCOL = 5
BOMB$ = CHR$(232)
SCORE = 0
Q$ = INKEY$
Player$ = CHR$(127)

'  RUN GAME

DO WHILE (Q$ <> "Q" AND Q$ <> "q" AND GAMEOVER$ = "N")
    COLOR 2, BACKGROUND
    LOCATE 23, 5
    PRINT "---------------------------------------------------------------------"
    LOCATE 23, 4 + PLAYERCOLM
    COLOR 14, BACKGROUND
    PRINT Player$
    Q$ = INKEY$

    ' HANDLE PAUSE
    IF (Q$ = "P" OR Q$ = "p") THEN
        COLOR 14, BACKGROUND
        LOCATE 23, 5
        CLS
        INPUT "(GAME PAUSED) PRESS ENTER TO CONTINUE:"; PAUSES$
        CLS
    END IF

    ' HANDLE PLAYER MOVEMENT

    IF Q$ = "A" OR Q$ = "a" THEN PLAYERCOLM = PLAYERCOLM - 1: PLAY "L64N40"
    IF Q$ = "D" OR Q$ = "d" THEN PLAYERCOLM = PLAYERCOLM + 1: PLAY "L64N40"
    IF PLAYERCOLM = 0 THEN PLAYERCOLM = 1
    IF PLAYERCOLM = 70 THEN PLAYERCOLM = 69
    IF Q$ = " " THEN FIRING$ = "Y"
    SHOTCOL = 4 + PLAYERCOLM

    ' HANDLE SHOT FIRED

    IF FIRING$ = "Y" THEN
        PLAY "L64N" + STR$(SHOTROW + 24)
        SHOTCOL = 4 + PLAYERCOLM
        SHOTROW = SHOTROW - 1
        LOCATE SHOTROW, SHOTCOL
        COLOR 4, BACKGROUND
        PRINT "|"
        IF SHOTROW < 23 THEN LOCATE SHOTROW + 1, SHOTCOL - 1: PRINT "   "
        IF SHOTROW = 1 THEN FIRING$ = "N"
        IF FIRING$ = "N" THEN
            LOCATE SHOTROW, SHOTCOL - 1
            PRINT "   "
            SHOTROW = 22
        END IF
    END IF

    ' HANDLE ALIEN MOVEMENT

    COUNTER = COUNTER + 1
    COUNTER = COUNTER MOD 24

    FOR INDEX = 0 TO 3

        DEGRAND = INT((RND * 5) + .5)
        INCREMENT = 0
        RESULT = COUNTER MOD SPEED (INDEX)
        IF RESULT = 0 THEN INCREMENT = 1
        IF ALIENDIR$(INDEX) = "R" THEN ALIENCOLM(INDEX) = ALIENCOLM(INDEX) + INCREMENT
        IF ALIENDIR$(INDEX) = "L" THEN ALIENCOLM(INDEX) = ALIENCOLM(INDEX) - INCREMENT
        IF ALIENDIR$( INDEX) = "R" AND ALIENCOLM(INDEX) = 70 THEN ALIENDIR$(INDEX) = "L": ALIENDEG(INDEX) = DEG(DEGRAND)
        IF ALIENDIR$( INDEX) = "L" AND ALIENCOLM(INDEX) = 5 THEN ALIENDIR$(INDEX) = "R": ALIENDEG(INDEX) = DEG(DEGRAND)

        ' HANDLE ALIEN MOVEMENT OFFSET
        ' COMMENT OUT THIS SECTION IF YOU GET EPILEPIC SEIZURES ****
                                                                  '*
        MAXMAG = INT(LEVEL / 5)                                   '*
        IF (MAXMAG > 4) THEN MAXMAG = 4                           '*
        DEGPERSTEP = ALIENDEG(INDEX) / POINTS                     '*   
        MAGDEGSTEP = 180 / POINTS                                 '*
        MAG = MAXMAG * SIN(MAGDEGSTEP * (ALIENCOLM(INDEX) - 5))   '*
        DEGOFF = (ALIENCOLM(INDEX) - 5) * DEGPERSTEP              '*
        XOFFSET = MAG * SIN(DEGOFF)                               '*
        YOFFSET = MAG * COS(DEGOFF)                               '*
                                                                  '*
        LOCATE LASTROW(INDEX), LASTCOL(INDEX)                     '*
        PRINT "     ";                                            '*
                                                                  '*
        ' COMMENT OUT THIS SECTION IF YOU GET EPILEPIC SEIZURES ****

        LOCATE ALIENROW(INDEX) + INT(YOFFSET), ALIENCOLM(INDEX) + INT(XOFFSET)
        COLOR ALIENCOLOR(INDEX), BACKGROUND
        PRINT ALIEN$( INDEX);
        LASTCOL(INDEX) = ALIENCOLM(INDEX) + INT(XOFFSET)
        LASTROW(INDEX) = ALIENROW(INDEX) + INT(YOFFSET)

        '  HANDLE PLAYER SHOT KILLING ALIEN

        IF SHOTROW = ALIENROW(INDEX) AND SHOTCOL > ALIENCOLM(INDEX) AND SHOTCOL < ALIENCOLM(INDEX) + 5 THEN
            PLAY "L45N80N40N20N10N5N0"

            IF (TEMPROW > 0) THEN LOCATE TEMPROW, TEMPCOL: PRINT "     "

            TEMPROW = ALIENROW(INDEX)
            TEMPCOL = ALIENCOLM(INDEX)

            ALIENCOLM(INDEX) = 4
            ALIENDIR$(INDEX) = "R"
            ALIENROW(INDEX) = INDEX + 5 + (INT(RND * 3) * 4)
   
            FIRING$ = "N"
            LOCATE SHOTROW, SHOTCOL - 1
            PRINT "   "
            SHOTROW = 22

            LOCATE TEMPROW, TEMPCOL
            COLOR 4, BACKGROUND
            PRINT " " + STR$(ALIENSCORE(INDEX)) + " "

            SCORE = SCORE + ALIENSCORE(INDEX) + ((LEVEL - 1) * 5)

        END IF

        '  HANDLE ALIEN BOMB DROP

        IF (INT(RND * BOMBSCOPE) = BOMBRANDO AND BOMBFIRED$(INDEX) = "N") THEN
     
            BOMBFIRED$(INDEX) = "Y"
            BOMBCOL(INDEX) = ALIENCOLM(INDEX) + 2
            BOMBROW(INDEX) = ALIENROW(INDEX)

        END IF

        '  HANDLE ALIEN BOMB MOVEMENT

        IF (BOMBFIRED$(INDEX) = "Y") THEN

            BOMBROW(INDEX) = BOMBROW(INDEX) + 1
            LOCATE BOMBROW(INDEX), BOMBCOL(INDEX)
            COLOR 4, BACKGROUND
            PRINT BOMB$
            LOCATE BOMBROW(INDEX) - 1, BOMBCOL(INDEX)
            PRINT "  "
            PLAY "L64N" + STR$((24 - BOMBROW(INDEX)) + 48)

        END IF

        '  HANDLE ALIEN BOMB DROP KILLING PLAYER OR DOING NOTHING

        IF (BOMBFIRED$(INDEX) = "Y" AND BOMBROW(INDEX) = 23) THEN

            IF (BOMBCOL(INDEX) > PLAYERCOLM + 2 AND BOMBCOL(INDEX) < PLAYERCOLM + 6) THEN
       
                LIVESCOUNT = LIVESCOUNT - 1
                IF (LIVESCOUNT = 0) THEN GAMEOVER$ = "Y"
                LOCATE 23, PLAYERCOL + 3
                COLOR 4, BACKGROUND
                PRINT "***"
                PLAY "L45N20N10N5N2N1N0L45N20N10N5N2N1N0L45N20N10N5N2N1N0L45N20N10N5N2N1N0"
                PLAYERCOL = 40
                BOMBFIRED$(INDEX) = "N"
   
            ELSE
       
                PLAY "L45N0N0N0N0N0N0N0"
                BOMBFIRED$(INDEX) = "N"
                LOCATE 23, BOMBCOL(INDEX)
                PRINT " "

            END IF

        END IF

    NEXT INDEX

    ' HANDLE SCORE AND LIVES PRINTING

    COLOR 14, BACKGROUND
    LOCATE 1, 60: PRINT STR$(SCORE)
    IF (LIVESCOUNT < 4) THEN
        LOCATE 1, 70: PRINT STRING$(LIVESCOUNT, Player$) + "  "
    END IF
    IF (LIVESCOUNT >= 4) THEN
        LOCATE 1, 70: PRINT STRING$(3, Player$) + STR$(LIVESCOUNT) + " "
    END IF

    ' HANDLE LEVELLING UP

    IF GAMEOVER$ = "N" AND SCORE >= LEVEL * 1000 THEN
        CLS

        BOMBSCOPE = BOMBSCOPE - 10
        IF BOMBSCOPE < BOMBRANDO THEN BOMBSCOPE = BOMBRANDO + 1
        LEVEL = LEVEL + 1

        IF (LEVEL MOD 5 = 0) THEN
            LIVESCOUNT = LIVESCOUNT + 1
        END IF

        PRINT " LEVEL "; LEVEL
        scale$ = "CEDAGFAGBGGA"
        PLAY "L18"
        FOR i%  = 0 TO 3
            PLAY "O" + STR$(i%)
            PLAY "X" + VARPTR$(scale$)
        NEXT i%
        LOCATE 1, 1
        PRINT " LEVEL "; LEVEL
    END IF

    IF (GAMEOVER$ = "Y") THEN

        LOCATE 12, 34
        COLOR 4, BACKGROUND
        PRINT " GAME OVER "
        scale$  = "ABCBAAACBAAABA"
        PLAY "L12"
        FOR i%  = 0 TO 1
            PLAY "O" + STR$(i%)
            PLAY "X" + VARPTR$(scale$)
        NEXT i%
        CLS

    END IF

    ' DELAY

    FOR X = 1 TO 500: NEXT X

LOOP
   
TYPE TestRecord
    Player AS STRING * 3
    SCORE AS DOUBLE
END TYPE
DIM MyClass AS TestRecord
OPEN "SCORES.DAT" FOR RANDOM AS #1 LEN = LEN(MyClass)

FOR X = 0 TO 9
    GET #1, X + 1, MyClass
    PLAYERSCORE(X) = MyClass.SCORE
    PLAYERINITIAL$(X) = MyClass.Player
NEXT X

PLAYERSCORE(10) = SCORE
PLAYERINITIAL$(10) = NAME$

MyClass.Player = NAME$
MyClass.SCORE = SCORE
PUT #1, 11, MyClass
CLOSE #1

DIM DONE AS INTEGER, A AS INTEGER, MAX AS INTEGER
MAX = UBOUND(PLAYERSCORE) - 1
DO
    DONE = 1
    FOR A = 1 TO MAX
        IF PLAYERSCORE(A) > PLAYERSCORE(A - 1) THEN
            DONE = 0
            SWAP PLAYERSCORE(A), PLAYERSCORE(A - 1)
            SWAP PLAYERINITIAL$(A), PLAYERINITIAL$(A - 1)
        END IF
    NEXT A
LOOP UNTIL DONE OR MAX < 1

KILL "SCORES.DAT"

OPEN "SCORES.DAT" FOR RANDOM AS #1 LEN = LEN(MyClass)

FOR X = 0 TO 9
    MyClass.Player = PLAYERINITIAL$(X)
    MyClass.SCORE = PLAYERSCORE(X)
    PUT #1, X + 1, MyClass
NEXT X
CLOSE #1

COLOR 14, BACKGROUND
LOCATE 4, 10
PRINT "        TOP 10 SCORES"
LOCATE 6, 10
PRINT "+===========================+"

FOR X = 0 TO 9
    LOCATE X + 7, 10
    PRINT "|  ";
    LOCATE X + 7, 15:
    PRINT PLAYERINITIAL$(X);
    LOCATE X + 7, 21
    IF (PLAYERSCORE(X) > 0) THEN
        PRINT STR$(PLAYERSCORE(X));
    END IF
    LOCATE X + 7, 38
    PRINT "|"
NEXT X
LOCATE 17, 10
PRINT "+===========================+"

scale$  = "GEDDDFDCCCCECBAGA"
PLAY "L12"
FOR i%  = 3 TO 2 STEP -1
    PLAY "O" + STR$(i%)
    PLAY "X" + VARPTR$(scale$)
NEXT i%

Galaxy Guard
' INSTRUCTIONS
RANDOMIZE(TIMER)
SCREEN 8
' GOOD COLORS 2,3,7,9,10,11,14,15  with 1 for background
BACKGROUND = 1
COLOR 2, BACKGROUND
INPUT "PLEASE ENTER YOUR INITIALS: ", NAME$
NAME$ = UCASE$(LEFT$(NAME$, 3))
CLS
PRINT " LEVEL 1 "
LOCATE 5, 10
PRINT "GALAXY GUARD!   TO YOUR POST!"
LOCATE 10, 10
PRINT "+===========================+"
LOCATE 11, 10
PRINT "|  INSTRUCTIONS:            |"
LOCATE 12, 10
PRINT "|  PRESS 'A' TO MOVE LEFT   |"
LOCATE 13, 10
PRINT "|  PRESS 'D' TO MOVE RIGHT  |"
LOCATE 14, 10
PRINT "|  PRESS SPACE TO SHOOT     |"
LOCATE 15, 10
PRINT "|  PRESS 'P' TO PAUSE       |"
LOCATE 16, 10
PRINT "|  PRESS 'Q' TO QUIT        |"
LOCATE 17, 10
PRINT "+===========================+"
scale$ = "CEDAGFAGBGGA"
PLAY "L16"
FOR i% = 0 TO 3
    PLAY "O" + STR$(i%)
    PLAY "X" + VARPTR$(scale$)
NEXT i%
'  INITIALIZE GAME
CLS
COUNTER = 0
LOCATE 1, 1
PRINT " LEVEL 1 "
DIM ALIEN$(4)
ALIEN$(0) = " <*> "
ALIEN$(1) = " /0\ "
ALIEN$(2) = " -&- "
ALIEN$(3) = " }@{ "
LEVEL = 1
DIM SPEED(4)
SPEED(0) = 1: SPEED(1) = 2: SPEED(2) = 3: SPEED(3) = 4
DIM ALIENROW(4)
ALIENROW(0) = 5: ALIENROW(1) = 6: ALIENROW(2) = 7: ALIENROW(3) = 8
DIM ALIENCOLM(4)
ALIENCOLM(0) = 40: ALIENCOLM(1) = 40: ALIENCOLM(2) = 40: ALIENCOLM(3) = 40
DIM ALIENCOLOR(4)
ALIENCOLOR(0) = 3: ALIENCOLOR(1) = 7: ALIENCOLOR(2) = 9: ALIENCOLOR(3) = 10
DIM ALIENDIR$(4)
ALIENDIR$(0) = "R": ALIENDIR$(1) = "R": ALIENDIR$(2) = "R": ALIENDIR$(3) = "R"
DIM ALIENSCORE(4)
ALIENSCORE(0) = 100: ALIENSCORE(1) = 75: ALIENSCORE(2) = 50: ALIENSCORE(3) = 25
DIM BOMBCOL(4)
BOMBCOL(0) = -1: BOMBCOL(1) = -1: BOMBCOL(2) = -1: BOMBCOL(3) = -1
DIM BOMBROW(4)
BOMBROW(0) = -1: BOMBROW(1) = -1: BOMBROW(2) = -1: BOMBROW(3) = -1
DIM BOMBFIRED$(4)
BOMBFIRED$(0) = "N": BOMBFIRED$(1) = "N": BOMBFIRED$(2) = "N": BOMBFIRED$(3) = "N"
DIM DEG(5)
DEG(0) = 0: DEG(1) = 3240: DEG(2) = 3600: DEG(3) = 1800: DEG(4) = 2160
POINTS = 70
DIM ALIENDEG(4)
ALIENDEG(0) = 0: ALIENDEG(1) = 0: ALIENDEG(2) = 0: ALIENDEG(3) = 0
DIM LASTCOL(4)
LASTCOL(0) = 5: LASTCOL(1) = 5: LASTCOL(2) = 5: LASTCOL(3) = 5
DIM LASTROW(4)
LASTROW(0) = 2: LASTROW(1) = 2: LASTROW(2) = 2: LASTROW(3) = 2
TEMPROW = 0
TEMPCOL = 0
BOMBRANDO = 2
BOMBSCOPE = 200
DIM PLAYERSCORE(12)
DIM PLAYERINITIAL$(12)
FOR X = 0 TO 11
    PLAYERSCORE(X) = 0
    PLAYERINITIAL$(X) = ""
NEXT X
' INITIALIZE PLAYER
LIVESCOUNT = 3
GAMEOVER$ = "N"
PLAYERCOLM = 40
FIRING$ = "N"
SHOTROW = 22
SHOTCOL = 5
BOMB$ = CHR$(232)
SCORE = 0
Q$ = INKEY$
Player$ = CHR$(127)
'  RUN GAME
DO WHILE (Q$ <> "Q" AND Q$ <> "q" AND GAMEOVER$ = "N")
    COLOR 2, BACKGROUND
    LOCATE 23, 5
    PRINT "---------------------------------------------------------------------"
    LOCATE 23, 4 + PLAYERCOLM
    COLOR 14, BACKGROUND
    PRINT Player$
    Q$ = INKEY$
    ' HANDLE PAUSE
    IF (Q$ = "P" OR Q$ = "p") THEN
        COLOR 14, BACKGROUND
        LOCATE 23, 5
        CLS
        INPUT "(GAME PAUSED) PRESS ENTER TO CONTINUE:"; PAUSES$
        CLS
    END IF
    ' HANDLE PLAYER MOVEMENT
    IF Q$ = "A" OR Q$ = "a" THEN PLAYERCOLM = PLAYERCOLM - 1: PLAY "L64N40"
    IF Q$ = "D" OR Q$ = "d" THEN PLAYERCOLM = PLAYERCOLM + 1: PLAY "L64N40"
    IF PLAYERCOLM = 0 THEN PLAYERCOLM = 1
    IF PLAYERCOLM = 70 THEN PLAYERCOLM = 69
    IF Q$ = " " THEN FIRING$ = "Y"
    SHOTCOL = 4 + PLAYERCOLM
    ' HANDLE SHOT FIRED
    IF FIRING$ = "Y" THEN
        PLAY "L64N" + STR$(SHOTROW + 24)
        SHOTCOL = 4 + PLAYERCOLM
        SHOTROW = SHOTROW - 1
        LOCATE SHOTROW, SHOTCOL
        COLOR 4, BACKGROUND
        PRINT "|"
        IF SHOTROW < 23 THEN LOCATE SHOTROW + 1, SHOTCOL - 1: PRINT "   "
        IF SHOTROW = 1 THEN FIRING$ = "N"
        IF FIRING$ = "N" THEN
            LOCATE SHOTROW, SHOTCOL - 1
            PRINT "   "
            SHOTROW = 22
        END IF
    END IF
    ' HANDLE ALIEN MOVEMENT
    COUNTER = COUNTER + 1
    COUNTER = COUNTER MOD 24
    FOR INDEX = 0 TO 3
        DEGRAND = INT((RND * 5) + .5)
        INCREMENT = 0
        RESULT = COUNTER MOD SPEED (INDEX)
        IF RESULT = 0 THEN INCREMENT = 1
        IF ALIENDIR$(INDEX) = "R" THEN ALIENCOLM(INDEX) = ALIENCOLM(INDEX) + INCREMENT
        IF ALIENDIR$(INDEX) = "L" THEN ALIENCOLM(INDEX) = ALIENCOLM(INDEX) - INCREMENT
        IF ALIENDIR$( INDEX) = "R" AND ALIENCOLM(INDEX) = 70 THEN ALIENDIR$(INDEX) = "L": ALIENDEG(INDEX) = DEG(DEGRAND)
        IF ALIENDIR$( INDEX) = "L" AND ALIENCOLM(INDEX) = 5 THEN ALIENDIR$(INDEX) = "R": ALIENDEG(INDEX) = DEG(DEGRAND)
        ' HANDLE ALIEN MOVEMENT OFFSET
        ' COMMENT OUT THIS SECTION IF YOU GET EPILEPIC SEIZURES ****
                                                                  '*
        MAXMAG = INT(LEVEL / 5)                                   '*
        IF (MAXMAG > 4) THEN MAXMAG = 4                           '*
        DEGPERSTEP = ALIENDEG(INDEX) / POINTS                     '*   
        MAGDEGSTEP = 180 / POINTS                                 '*
        MAG = MAXMAG * SIN(MAGDEGSTEP * (ALIENCOLM(INDEX) - 5))   '*
        DEGOFF = (ALIENCOLM(INDEX) - 5) * DEGPERSTEP              '*
        XOFFSET = MAG * SIN(DEGOFF)                               '*
        YOFFSET = MAG * COS(DEGOFF)                               '*
                                                                  '*
        LOCATE LASTROW(INDEX), LASTCOL(INDEX)                     '*
        PRINT "     ";                                            '*
                                                                  '*
        ' COMMENT OUT THIS SECTION IF YOU GET EPILEPIC SEIZURES ****
        LOCATE ALIENROW(INDEX) + INT(YOFFSET), ALIENCOLM(INDEX) + INT(XOFFSET)
        COLOR ALIENCOLOR(INDEX), BACKGROUND
        PRINT ALIEN$( INDEX);
        LASTCOL(INDEX) = ALIENCOLM(INDEX) + INT(XOFFSET)
        LASTROW(INDEX) = ALIENROW(INDEX) + INT(YOFFSET)
        '  HANDLE PLAYER SHOT KILLING ALIEN
        IF SHOTROW = ALIENROW(INDEX) AND SHOTCOL > ALIENCOLM(INDEX) AND SHOTCOL < ALIENCOLM(INDEX) + 5 THEN
            PLAY "L45N80N40N20N10N5N0"
            IF (TEMPROW > 0) THEN LOCATE TEMPROW, TEMPCOL: PRINT "     "
            TEMPROW = ALIENROW(INDEX)
            TEMPCOL = ALIENCOLM(INDEX)
            ALIENCOLM(INDEX) = 4
            ALIENDIR$(INDEX) = "R"
            ALIENROW(INDEX) = INDEX + 5 + (INT(RND * 3) * 4)
   
            FIRING$ = "N"
            LOCATE SHOTROW, SHOTCOL - 1
            PRINT "   "
            SHOTROW = 22
            LOCATE TEMPROW, TEMPCOL
            COLOR 4, BACKGROUND
            PRINT " " + STR$(ALIENSCORE(INDEX)) + " "
            SCORE = SCORE + ALIENSCORE(INDEX) + ((LEVEL - 1) * 5)
        END IF
        '  HANDLE ALIEN BOMB DROP
        IF (INT(RND * BOMBSCOPE) = BOMBRANDO AND BOMBFIRED$(INDEX) = "N") THEN
     
            BOMBFIRED$(INDEX) = "Y"
            BOMBCOL(INDEX) = ALIENCOLM(INDEX) + 2
            BOMBROW(INDEX) = ALIENROW(INDEX)
        END IF
        '  HANDLE ALIEN BOMB MOVEMENT
        IF (BOMBFIRED$(INDEX) = "Y") THEN
            BOMBROW(INDEX) = BOMBROW(INDEX) + 1
            LOCATE BOMBROW(INDEX), BOMBCOL(INDEX)
            COLOR 4, BACKGROUND
            PRINT BOMB$
            LOCATE BOMBROW(INDEX) - 1, BOMBCOL(INDEX)
            PRINT "  "
            PLAY "L64N" + STR$((24 - BOMBROW(INDEX)) + 48)
        END IF
        '  HANDLE ALIEN BOMB DROP KILLING PLAYER OR DOING NOTHING
        IF (BOMBFIRED$(INDEX) = "Y" AND BOMBROW(INDEX) = 23) THEN
            IF (BOMBCOL(INDEX) > PLAYERCOLM + 2 AND BOMBCOL(INDEX) < PLAYERCOLM + 6) THEN
       
                LIVESCOUNT = LIVESCOUNT - 1
                IF (LIVESCOUNT = 0) THEN GAMEOVER$ = "Y"
                LOCATE 23, PLAYERCOL + 3
                COLOR 4, BACKGROUND
                PRINT "***"
                PLAY "L45N20N10N5N2N1N0L45N20N10N5N2N1N0L45N20N10N5N2N1N0L45N20N10N5N2N1N0"
                PLAYERCOL = 40
                BOMBFIRED$(INDEX) = "N"
   
            ELSE
       
                PLAY "L45N0N0N0N0N0N0N0"
                BOMBFIRED$(INDEX) = "N"
                LOCATE 23, BOMBCOL(INDEX)
                PRINT " "
            END IF
        END IF
    NEXT INDEX
    ' HANDLE SCORE AND LIVES PRINTING
    COLOR 14, BACKGROUND
    LOCATE 1, 60: PRINT STR$(SCORE)
    IF (LIVESCOUNT < 4) THEN
        LOCATE 1, 70: PRINT STRING$(LIVESCOUNT, Player$) + "  "
    END IF
    IF (LIVESCOUNT >= 4) THEN
        LOCATE 1, 70: PRINT STRING$(3, Player$) + STR$(LIVESCOUNT) + " "
    END IF
    ' HANDLE LEVELLING UP
    IF GAMEOVER$ = "N" AND SCORE >= LEVEL * 1000 THEN
        CLS
        BOMBSCOPE = BOMBSCOPE - 10
        IF BOMBSCOPE < BOMBRANDO THEN BOMBSCOPE = BOMBRANDO + 1
        LEVEL = LEVEL + 1
        IF (LEVEL MOD 5 = 0) THEN
            LIVESCOUNT = LIVESCOUNT + 1
        END IF
        PRINT " LEVEL "; LEVEL
        scale$ = "CEDAGFAGBGGA"
        PLAY "L18"
        FOR i%  = 0 TO 3
            PLAY "O" + STR$(i%)
            PLAY "X" + VARPTR$(scale$)
        NEXT i%
        LOCATE 1, 1
        PRINT " LEVEL "; LEVEL
    END IF
    IF (GAMEOVER$ = "Y") THEN
        LOCATE 12, 34
        COLOR 4, BACKGROUND
        PRINT " GAME OVER "
        scale$  = "ABCBAAACBAAABA"
        PLAY "L12"
        FOR i%  = 0 TO 1
            PLAY "O" + STR$(i%)
            PLAY "X" + VARPTR$(scale$)
        NEXT i%
        CLS
    END IF
    ' DELAY
    FOR X = 1 TO 500: NEXT X
LOOP
   
TYPE TestRecord
    Player AS STRING * 3
    SCORE AS DOUBLE
END TYPE
DIM MyClass AS TestRecord
OPEN "SCORES.DAT" FOR RANDOM AS #1 LEN = LEN(MyClass)
FOR X = 0 TO 9
    GET #1, X + 1, MyClass
    PLAYERSCORE(X) = MyClass.SCORE
    PLAYERINITIAL$(X) = MyClass.Player
NEXT X
PLAYERSCORE(10) = SCORE
PLAYERINITIAL$(10) = NAME$
MyClass.Player = NAME$
MyClass.SCORE = SCORE
PUT #1, 11, MyClass
CLOSE #1
DIM DONE AS INTEGER, A AS INTEGER, MAX AS INTEGER
MAX = UBOUND(PLAYERSCORE) - 1
DO
    DONE = 1
    FOR A = 1 TO MAX
        IF PLAYERSCORE(A) > PLAYERSCORE(A - 1) THEN
            DONE = 0
            SWAP PLAYERSCORE(A), PLAYERSCORE(A - 1)
            SWAP PLAYERINITIAL$(A), PLAYERINITIAL$(A - 1)
        END IF
    NEXT A
LOOP UNTIL DONE OR MAX < 1
KILL "SCORES.DAT"
OPEN "SCORES.DAT" FOR RANDOM AS #1 LEN = LEN(MyClass)
FOR X = 0 TO 9
    MyClass.Player = PLAYERINITIAL$(X)
    MyClass.SCORE = PLAYERSCORE(X)
    PUT #1, X + 1, MyClass
NEXT X
CLOSE #1
COLOR 14, BACKGROUND
LOCATE 4, 10
PRINT "        TOP 10 SCORES"
LOCATE 6, 10
PRINT "+===========================+"
FOR X = 0 TO 9
    LOCATE X + 7, 10
    PRINT "|  ";
    LOCATE X + 7, 15:
    PRINT PLAYERINITIAL$(X);
    LOCATE X + 7, 21
    IF (PLAYERSCORE(X) > 0) THEN
        PRINT STR$(PLAYERSCORE(X));
    END IF
    LOCATE X + 7, 38
    PRINT "|"
NEXT X
LOCATE 17, 10
PRINT "+===========================+"
scale$  = "GEDDDFDCCCCECBAGA"
PLAY "L12"
FOR i%  = 3 TO 2 STEP -1
    PLAY "O" + STR$(i%)
    PLAY "X" + VARPTR$(scale$)
NEXT i%

Comments