' 23 MAY 2020 === PUBLIC DEMO 4 ===
'known issue: bottom of planet missing past halfway point
'known issue: damage animations need work
'known issue: missing frame on title screen between animations

'OPTION _EXPLICIT ' - finds undeclared variables
'               - player can resize screen as needed!
$RESIZE:SMOOTH

_TITLE "Loading . . ."

RESTART:
CONST FALSE = 0, TRUE = NOT FALSE '     - used to see if player shots are active
CONST maxshots = 24 ' 10                - sets maximum number of player shots and enemy shots
CONST lettersum = 9 '                   - number of letters in "SCRAPSHIP"
CONST maxrotation = 40 '                - allows for up to 40 frames of planet rotation
CONST fourcount = 4 '                   - used for powerups
CONST fivecount = 5 '                    - sets number of explosion frames and shield frames for the fighter
CONST deflectcount = 3 '5 '             - sets number of deflect frames for the shield
CONST fighterdrop = 25 '                - sets number of fighter drop frames
CONST maxguns = 4
CONST scrapcol = 100
CONST laserstormcount = 15

TYPE PLAYER
    PIC AS LONG
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    XKILLBOX AS SINGLE
    YKILLBOX AS SINGLE
    X AS INTEGER
    Y AS INTEGER
    HEALTH AS INTEGER
    SPEED AS INTEGER
    KILLED AS INTEGER
END TYPE

TYPE LETTERSCRAP
    PIC AS LONG
    X AS INTEGER
    Y AS INTEGER
END TYPE

TYPE SCRAP
    PIC AS LONG
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    SPEED AS INTEGER
    COLLECTED AS INTEGER ' - determines if scrap has been collected or not
END TYPE

TYPE LASERSTORM
    PIC AS LONG
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    SPEED AS INTEGER
    DAMAGE AS INTEGER
END TYPE

TYPE SCRAPSTORM
    PIC AS LONG
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    SPEED AS INTEGER
END TYPE

TYPE BACKGROUNDSCRAP
    PIC AS LONG
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    SPEED AS INTEGER
END TYPE

TYPE MULTISHOT
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    MIDX AS SINGLE
    X AS INTEGER
    Y AS INTEGER
    SPEED AS INTEGER
    RANGE AS INTEGER
    ACTIVE AS _BYTE
END TYPE

TYPE FIGHTERSHOT
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS SINGLE
    Y AS SINGLE
    SPEED AS INTEGER
    DAMAGE AS INTEGER
END TYPE

TYPE BOMBERSHOT
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    SPEED AS INTEGER
    DAMAGE AS INTEGER
    RANGE AS INTEGER
END TYPE

TYPE CRUISERSHOT
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS SINGLE
    Y AS SINGLE
    SPEED AS INTEGER
    DAMAGE AS INTEGER
END TYPE

TYPE BATTLESHIPSHOT
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    MIDX AS SINGLE
    X AS INTEGER
    Y AS INTEGER
    SPEED AS INTEGER
    DAMAGE AS INTEGER
    RANGE AS INTEGER
    ACTIVE AS _BYTE
END TYPE

TYPE FIGHTERS
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    XKILLBOX AS INTEGER
    YKILLBOX AS INTEGER
    RANDOMY AS INTEGER
    HEALTH AS INTEGER
    FIGHTERSPEED AS INTEGER
    KILLHIT AS INTEGER
    GRAZEHIT AS INTEGER
    SHOTX AS INTEGER
    SHOTY AS INTEGER
    KILLED AS INTEGER
    BLASTNUM AS INTEGER
    FIRING AS INTEGER
    ACTIVE AS INTEGER
    SHIELDHEALTH AS INTEGER
    SHIELDON AS INTEGER
    TIMESTART AS INTEGER
    ICONPICKEDUP AS INTEGER
    RANDOMICON AS INTEGER
    GLOBALTIMER AS INTEGER
END TYPE

TYPE FIGHTERSICON
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    XKILLBOX AS INTEGER
    YKILLBOX AS INTEGER
    RANDOMY AS INTEGER
    HEALTH AS INTEGER
    FIGHTERSPEED AS INTEGER
    KILLHIT AS INTEGER
    KILLED AS INTEGER
    FIRING AS INTEGER
    ACTIVE AS INTEGER
    SHIELDON AS INTEGER
    ICONPICKEDUP AS INTEGER
    ICONREADY AS INTEGER
    VALUESCOPIED AS INTEGER
    RANDOMICON AS INTEGER
END TYPE

TYPE BOMBERS
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    XKILLBOX AS INTEGER
    YKILLBOX AS INTEGER
    RANDOMY AS INTEGER
    HEALTH AS INTEGER
    BOMBERSPEED AS INTEGER
    ACTIVE AS INTEGER
    KILLED AS INTEGER
    TIMESTART AS INTEGER
    RANDOMICON AS INTEGER
    GLOBALTIMER AS INTEGER
    ARBPIC AS INTEGER
    COUNTINGDOWN AS INTEGER
    ICONPICKEDUP AS INTEGER
END TYPE

TYPE CRUISERS
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    XKILLBOX AS INTEGER
    YKILLBOX AS INTEGER
    RANDOMY AS INTEGER
    HEALTH AS INTEGER
    CRUISERSPEED AS INTEGER
    VISIBLE AS INTEGER
    KILLED AS INTEGER
    CRUISER AS INTEGER
    STOPPINGY AS INTEGER
    STOPPED AS INTEGER
    FIRING AS INTEGER 'TEST
    ACTIVE AS INTEGER
    DISTANCEX AS SINGLE
    DISTANCEY AS SINGLE
    ODDSOFACTIVE AS INTEGER
    PLAYERPOSITION AS INTEGER
    PLAYERABOVE AS INTEGER
    TIMESTART AS INTEGER
    ICONPICKEDUP AS INTEGER
    RANDOMICON AS INTEGER
    GLOBALTIMER AS INTEGER
END TYPE

TYPE BATTLESHIPS
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    HEALTH AS INTEGER
    BATTLESHIPSPEED AS INTEGER
    VISIBLE AS INTEGER
    KILLED AS INTEGER
    STOPPINGX AS INTEGER
    RANDOMY AS INTEGER
    ACTIVE AS INTEGER
END TYPE

TYPE CARRIERS
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    HEALTH AS INTEGER
    HEALTHTOTAL AS INTEGER
    CARRIERSPEED AS INTEGER
    VISIBLE AS INTEGER
    KILLED AS INTEGER
    STOPPINGY AS INTEGER
    ACTIVE AS INTEGER
END TYPE

TYPE SELECTOR
    X AS INTEGER
    Y AS INTEGER
END TYPE

TYPE WINDOW
    WIDTH AS INTEGER
    HEIGHT AS INTEGER
    COLORS AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    TOP AS INTEGER
    BOTTOM AS INTEGER
    RIGHT AS INTEGER
    LEFT AS INTEGER
END TYPE

'================================================SCRIPT BOOLEANS
DIM SHARED foregroundscrapscriptran AS INTEGER
DIM SHARED boss1scriptran AS INTEGER
DIM SHARED backgroundscrapscriptran AS INTEGER
DIM SHARED rotationscript AS INTEGER
DIM SHARED healthscriptran AS INTEGER
DIM SHARED animation1ran AS INTEGER
DIM SHARED animation2ran AS INTEGER
DIM SHARED scrapstormscript AS INTEGER
DIM SHARED laserstormscript AS INTEGER

'===============================================REGULAR BOOLEANS
DIM SHARED playermovingcase AS INTEGER ' 1 = moving left, 2 = stationary, 3 = moving right
DIM SHARED issoundon AS INTEGER
DIM SHARED isaudioon AS INTEGER
DIM SHARED endcredits AS INTEGER
DIM SHARED gamepaused AS INTEGER
DIM SHARED audioplayed AS INTEGER

'=================================================RANDOM VARIABLES
RANDOMIZE TIMER
DIM SHARED numscrap AS INTEGER
numscrap = INT(RND * 20) + 12 'generates between 12 and 32 pieces of scrap  * 20 + 12

DIM SHARED bscrap AS INTEGER
bscrap = INT(RND * 20) + 40 'generates between 40 and 60 backgroundscrap

DIM SHARED numfighters AS INTEGER
numfighters = 30

DIM SHARED numbombers AS INTEGER
numbombers = 10

DIM SHARED numcruisers AS INTEGER
numcruisers = 4

DIM SHARED numbships AS INTEGER
numbships = 1

DIM SHARED numcarriers AS INTEGER
numcarriers = 1

'==========================================================ARRAYS AND ARRAY TYPES
DIM SHARED lscrap(lettersum) AS LETTERSCRAP
DIM SHARED scrap(numscrap) AS SCRAP
DIM SHARED lstorm(laserstormcount) AS LASERSTORM
DIM SHARED scrapstorm(scrapcol) AS SCRAPSTORM
DIM SHARED bgscrap(bscrap) AS BACKGROUNDSCRAP
DIM SHARED xshot(maxshots) AS MULTISHOT
DIM SHARED batshot(maxshots) AS BATTLESHIPSHOT
DIM SHARED fighters(numfighters) AS FIGHTERS
DIM SHARED fightersicon(numfighters) AS FIGHTERSICON
DIM SHARED bombers(numbombers) AS BOMBERS
DIM SHARED cruisers(numcruisers) AS CRUISERS
DIM SHARED bships(numbships) AS BATTLESHIPS
DIM SHARED carriers(numcarriers) AS CARRIERS
DIM SHARED fshot(numfighters) AS FIGHTERSHOT
DIM SHARED bshot(numbombers) AS BOMBERSHOT
DIM SHARED cshot(numcruisers) AS CRUISERSHOT
DIM SHARED planetrotation(maxrotation) AS LONG
DIM SHARED dropfighter(fighterdrop) AS LONG
DIM SHARED blastgif(fivecount) AS LONG
DIM SHARED shieldgif(fivecount) AS LONG
DIM SHARED deflectgif(deflectcount) AS LONG
DIM SHARED drawrapid(fourcount) AS LONG
DIM SHARED drawsingle(fourcount) AS LONG
DIM SHARED drawscannon(fourcount) AS LONG
DIM SHARED draweshot(fourcount) AS LONG

'==========================================================IN-GAME COUNTERS
DIM SHARED scrapcollected AS INTEGER
DIM SHARED rotationcount AS INTEGER
DIM SHARED scrapoffscreen AS INTEGER
DIM SHARED lasersoffscreen AS INTEGER
DIM SHARED scrapstormcollected AS INTEGER

'==========================================================NON-ARRAY TYPES
DIM SHARED player AS PLAYER
DIM SHARED win AS WINDOW
DIM SHARED selector AS SELECTOR

'=======================================================STANDALONE VARIABLES
DIM SHARED playerkeydelay AS INTEGER
DIM SHARED loadlevel AS INTEGER
DIM SHARED levelinit AS INTEGER
DIM SHARED irotation AS INTEGER
DIM SHARED iterations AS INTEGER
DIM SHARED fighterframes AS INTEGER
DIM SHARED yiterations AS INTEGER
DIM SHARED soundlevel AS SINGLE
DIM SHARED audiolevel AS SINGLE
DIM SHARED musiclevel AS SINGLE
DIM SHARED soundtimer AS SINGLE
DIM SHARED soundlength AS SINGLE
DIM SHARED singlelaserupgrade AS INTEGER
DIM SHARED rapidlaserupgrade AS INTEGER
DIM SHARED scrapcannonupgrade AS INTEGER
DIM SHARED fighterlaserupgrade AS INTEGER
DIM SHARED blastnum AS INTEGER
DIM SHARED gamefps AS INTEGER
DIM SHARED dropy AS INTEGER ' - y coordinate for dropping the fighter

'--------------SHOTDOWN
DIM SHARED shotdown AS INTEGER
DIM SHARED fightersdown AS INTEGER
DIM SHARED bombersdown AS INTEGER
DIM SHARED cruisersdown AS INTEGER
DIM SHARED bshipsdown AS INTEGER

'--------------SOUNDS
DIM SHARED playerdiedsound AS LONG
DIM SHARED singlelasersound AS LONG
DIM SHARED multilasersound AS LONG
DIM SHARED scrapcannonsound AS LONG
DIM SHARED scrapcollectedsound AS LONG
DIM SHARED enemylasersound AS LONG

'--------------AUDIO
DIM SHARED singlelaseraudio AS LONG
DIM SHARED rapidlaseraudio AS LONG
DIM SHARED healthcriticalaudio AS LONG
DIM SHARED collectscrapaudio AS LONG
DIM SHARED enemyincomingaudio AS LONG
DIM SHARED greatpilotingaudio AS LONG
DIM SHARED notbadaudio AS LONG
'DIM SHARED thatllhelpaudio AS LONG

'--------------MUSIC
DIM SHARED levelonemusic AS LONG
DIM SHARED leveltwomusic AS LONG

'--------------PICS
DIM SHARED gameovertext AS LONG
DIM SHARED incomingtext AS LONG
DIM SHARED playerbankleft AS LONG
DIM SHARED playerbankright AS LONG
DIM SHARED playerdmg1 AS LONG
DIM SHARED playerdmg2 AS LONG
DIM SHARED playerdmg3 AS LONG
DIM SHARED playerdmg4 AS LONG
DIM SHARED playerdmg5 AS LONG
DIM SHARED bombershotpic1 AS LONG
DIM SHARED bombershotpic2 AS LONG
DIM SHARED bombershotpic3 AS LONG
DIM SHARED cruisershotpic AS LONG
DIM SHARED fighterunit AS LONG
DIM SHARED fighterdmg1 AS LONG
DIM SHARED fighterdmg2 AS LONG
DIM SHARED fighterdmg3 AS LONG
DIM SHARED bomberunit AS LONG
DIM SHARED bomberdmg1 AS LONG
DIM SHARED bomberdmg2 AS LONG
DIM SHARED bomberdmg3 AS LONG
DIM SHARED bshipunit AS LONG ' - battleship
DIM SHARED bshipdmg1 AS LONG
DIM SHARED bshipdmg2 AS LONG
DIM SHARED bshipdmg3 AS LONG
DIM SHARED cruiserunit AS LONG
DIM SHARED cruiserdmg1 AS LONG
DIM SHARED cruiserdmg2 AS LONG
DIM SHARED cruiserdmg3 AS LONG
DIM SHARED carrierunit AS LONG
DIM SHARED ssunit AS LONG ' - space station
DIM SHARED carriersideunit AS LONG
DIM SHARED titleunit AS LONG
DIM SHARED testunit AS LONG
DIM SHARED iconspeed AS LONG
DIM SHARED iconwidth AS LONG
DIM SHARED icondamage AS LONG
DIM SHARED iconscrapstorm AS LONG
DIM SHARED iconrapidlaser AS LONG
DIM SHARED iconsinglelaser AS LONG
DIM SHARED iconscrapcannon AS LONG
DIM SHARED statguide AS LONG
DIM SHARED laserstorm AS LONG
DIM SHARED sshotpic AS LONG

DIM SHARED selectorpic AS LONG
DIM SHARED creditsinsta AS LONG

'-------------FONTS
DIM SHARED gamefontlrg AS LONG
DIM SHARED gamefontmed AS LONG
DIM SHARED medfontint AS INTEGER

DIM SHARED menucase AS INTEGER
DIM SHARED weapontype AS INTEGER

'------------OTHER
DIM SHARED k AS INTEGER ' for key strokes
DIM SHARED fighterwave AS INTEGER ' - keeps track of the fighterwave number
DIM SHARED bomberwave AS INTEGER
DIM SHARED cruiserwave AS INTEGER
DIM SHARED fighterscanmove AS INTEGER
DIM SHARED bomberscanmove AS INTEGER
DIM SHARED cruiserscanmove AS INTEGER
DIM SHARED baseheight AS INTEGER
DIM SHARED basewidth AS INTEGER
DIM SHARED basedamage AS INTEGER
DIM SHARED upgradeheight AS INTEGER
DIM SHARED upgradewidth AS INTEGER
DIM SHARED upgradespeed AS INTEGER
DIM SHARED upgradedamage AS INTEGER
DIM SHARED totaldamage AS INTEGER
DIM SHARED extradamage AS INTEGER
DIM SHARED decreasekeydelay AS INTEGER
DIM SHARED eupgradewidth AS INTEGER
DIM SHARED eupgradeheight AS INTEGER
DIM SHARED eupgradespeed AS INTEGER
DIM SHARED eupgradedamage AS INTEGER
'DIM SHARED texty AS INTEGER

'-------------TEST
DIM SHARED numshots AS INTEGER
DIM SHARED shotnum AS INTEGER
DIM SHARED eshotnum AS INTEGER
DIM SHARED fighters_active_wave_zero AS INTEGER
DIM SHARED fighters_active_wave_one AS INTEGER
DIM SHARED bombers_active_wave_zero AS INTEGER
DIM SHARED bombers_active_wave_one AS INTEGER
DIM SHARED cruisers_active_wave_zero AS INTEGER
DIM SHARED cruisers_active_wave_one AS INTEGER
DIM SHARED numall AS INTEGER
DIM SHARED testx AS INTEGER ' - for testing of images (fog of war effect)
DIM SHARED testy AS INTEGER
DIM SHARED shothit AS INTEGER ' - player hit counter
DIM SHARED shotfired AS INTEGER ' -  player fired counter
DIM SHARED hitrate AS INTEGER


'--------------UNSHARED VARIABLES
DIM rw AS INTEGER ' - for resize
DIM rh AS INTEGER ' - for resize
DIM rwide AS STRING ' - for resize
DIM rhigh AS STRING ' - for resize

'=====================================================================================================================
'=====================================================================================================================
'                                               === PRIMARY GAME LOOP ===
'
'
newscreen___SETUP '
controls___MISC '                                      - loads the control instructions
basicsettings___SETUP '                                 - loads the basic settings for all variables
'overlapchecks___SETUP '                                 - makes sure ships are not overlapping
loadallgameassets___SETUP '                             - loads sounds and graphics
'IF issoundon = 1 THEN
'    _SNDVOL levelonemusic, musiclevel
'    IF levelonemusic THEN _SNDLOOP levelonemusic
'END IF
NEWGAMEPLUS:
DO
    rw = _RESIZEWIDTH
    rh = _RESIZEHEIGHT
    rwide = STR$(rw)
    rhigh = STR$(rh)
    _TITLE "Scrapship " + rwide + " x " + rhigh + "              resize window by dragging corners"

    k = _KEYHIT '                               - variable to hold _keyhit values in main loop
    soundtimer = TIMER
    hitrate = (shothit / shotfired) * 100
    IF hitrate < 0 THEN hitrate = 0
    IF hitrate > 100 THEN hitrate = 100

    _LIMIT gamefps '                                 - limits Frames Per Second to 60 control game speed.  45 works well on single
    PCOPY _DISPLAY, 1
    ' -----------------------------   GAME LEVELS WHILE PLAYER ALIVE   -------------------------------
    IF player.HEALTH > 0 THEN '                 - if player alive

        SELECT CASE loadlevel '                 - determine what level to load
            CASE 0
                titlescreen___SETUP '                   - load titlescreen and tutorial
            CASE 1
                level1 '                        - load level 1
            CASE 2
                level2 '                        - load level 2
            CASE 3
                level3 '                        - load level 3
        END SELECT

        collisioncheck___PLAYER
        'iconsteal___ENEMY
        overlapchecks___SETUP
        debugtools___MISC

        ' - warn player of low health
        IF player.HEALTH < 30 AND isaudioon = 1 AND healthscriptran = 0 THEN
            _SNDVOL healthcriticalaudio, audiolevel
            _SNDPLAYCOPY healthcriticalaudio
            healthscriptran = 1
        END IF

        '      --------------------------------   PLAYER SURVIVES   -------------------------------------------------

        FOR i = 1 TO numbships

            IF bships(i).HEALTH <= 0 OR bships(i).KILLED = 1 THEN
                _SNDVOL greatingpilotingaudio, audiolevel
                _SNDPLAYCOPY greatpilotingaudio

                _FONT gamefontlrg

                DO
                    k2 = _KEYHIT

                    stattext___MISC

                    IF k2 = 78 OR k2 = 110 THEN SYSTEM 'N

                    IF k2 = 89 OR k2 = 121 THEN 'Y
                        '_SNDSTOP levelonemusic
                        '_SNDSTOP leveltwomusic
                        '_SNDCLOSE levelonemusic
                        '_SNDCLOSE leveltwomusic
                        basicsettings___SETUP
                        setletters___MISC
                        GOTO OUTSIDELOOP: 'NEWGAMEPLUS:
                    END IF

                    _DISPLAY

                LOOP UNTIL (k2 = 78 OR k2 = 110) OR (k2 = 89 OR k2 = 121)

            END IF

        NEXT

    END IF

    ' --------------------------------------  PLAYER DIES   ----------------------------------

    IF player.HEALTH <= 0 OR player.KILLED = 1 THEN '       - if player killed
        player.KILLED = 1
        IF issoundon = 1 THEN
            _SNDVOL playerdiedsound, soundlevel
            IF playerdiedsound THEN _SNDPLAYCOPY playerdiedsound
        END IF

        RANDOMIZE TIMER

        DIM SHARED clr AS INTEGER
        DIM SHARED rndm AS INTEGER

        TYPE ftype
            vx AS SINGLE
            vy AS SINGLE
        END TYPE
        DIM frag(500) AS ftype 'fragments

        DIM pi AS SINGLE
        pi = 3.141593

        DIM x AS SINGLE, y AS SINGLE
        DIM time AS SINGLE, pow AS SINGLE 'grav as single
        time = 0
        pow = 5 'explosion power '15

        FOR i = 0 TO UBOUND(frag)
            frag(i).vx = RND * TAN(2 * pi * RND)
            frag(i).vy = RND * TAN(2 * pi * RND)
        NEXT

        x = win.WIDTH * RND
        y = win.HEIGHT * RND

        FOR time = 0 TO 25 STEP 0.2
            movebackgroundscrap___MISC '       - keeps background intact along with explosion
            movescrap___MISC
            scraphitdetect___PLAYER
            movefighters___ENEMY
            fightershots___ENEMY
            movecruisers___ENEMY
            cruisershots___ENEMY

            _DISPLAY
            PCOPY 1, _DISPLAY
            _PUTIMAGE (win.X, win.Y), planetrotation(irotation) ' - keeps planet behind the explosion

            FOR i = 0 TO UBOUND(frag)
                rndm = INT(RND * 4) + 1
                randomcolors___MISC
                PSET (player.XKILLBOX + time * pow * frag(i).vx, player.YKILLBOX + time * pow * frag(i).vy), clr
                randomcolors___MISC
                PSET (player.XKILLBOX + time * pow * frag(i).vx, player.YKILLBOX + rndm + time * pow * frag(i).vy), clr
                randomcolors___MISC
                PSET (player.XKILLBOX + rndm + time * pow * frag(i).vx, player.YKILLBOX + time * pow * frag(i).vy), clr
                randomcolors___MISC
                PSET (player.XKILLBOX + rndm + time * pow * frag(i).vx, player.YKILLBOX + rndm + time * pow * frag(i).vy), clr
                randomcolors___MISC
                PSET (player.XKILLBOX + rndm + time * pow * frag(i).vx, player.YKILLBOX + time * pow * frag(i).vy), clr
                randomcolors___MISC
                PSET (player.XKILLBOX + rndm + time * pow * frag(i).vx, player.YKILLBOX + rndm + time * pow * frag(i).vy), clr

            NEXT
            _LIMIT 60
        NEXT

        player.X = -500 ' - remove fighter from screen so it doesn't collect scrap
        player.Y = -500
        '_SNDVOL notbadaudio, audiolevel
        '_SNDPLAYCOPY notbadaudio

        DO
            movebackgroundscrap___MISC '       - keeps background intact along with explosion
            _PUTIMAGE (win.X, win.Y), planetrotation(irotation)
            movescrap___MISC
            scraphitdetect___PLAYER
            movefighters___ENEMY
            fightershots___ENEMY
            movecruisers___ENEMY
            cruisershots___ENEMY

            k3 = _KEYHIT

            _PUTIMAGE (0, 0), gameovertext

            IF k3 = 78 OR k3 = 110 THEN 'N
                SYSTEM
            END IF

            IF k3 = 89 OR k3 = 121 THEN 'Y
                freeimages___SETUP
                GOTO OUTSIDELOOP:
            END IF

            _DISPLAY
            PCOPY 1, _DISPLAY
            _LIMIT 30
        LOOP UNTIL (k3 = 78 OR k3 = 110) OR (k3 = 89 OR k3 = 121)

    END IF
    ' --------------------------------------------------   END PLAYER DIES   -----------------------------

    '---------------------- PAUSE GAME

    'IF (k = 80 OR k = 112) AND gamepaused = 1 THEN
    '    gamefps = 60
    '    gamepaused = 0
    '    GOTO skippause:
    'END IF

    IF (k = 80 OR k = 112) AND gamepaused = 0 THEN
        _PUTIMAGE (96, 160), statguide
        _DISPLAY
        SLEEP
    END IF
    'gamefps = 1
    'gamepaused = 1

    'skippause:
    escapekey___MISC

    _DISPLAY
    PCOPY 1, _DISPLAY

LOOP
OUTSIDELOOP:
CLEAR
GOTO RESTART:
'-------------------------------------------- ^^^ PRIMARY GAME LOOP ^^^ -----------------------------------------------
'=======================================================================================================================
'========================================   SUBS START HERE   ==========================================================
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

'                                               !!! LEVEL subroutines !!!

'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB level1 '====================================================================================SUB LEVEL 1

    movebackgroundscrap___MISC

    moveplayer___PLAYER

    movescrap___MISC

    IF animation1ran = 0 THEN
        _PUTIMAGE (175, dropy), titleunit
    END IF

    IF animation2ran = 1 THEN
        scraphitdetect___PLAYER
    END IF

    fireweapon___PLAYER

    generichitdetection___PLAYER

    IF animation1ran = 0 THEN
        _PUTIMAGE (175, dropy), titleunit
        dropy = dropy - 2
        IF dropy <= 455 THEN
            dropy = 455
            animation1ran = 1
        END IF
    END IF

    IF animation1ran = 1 AND animation2ran = 0 THEN
        _LIMIT 45
        _PUTIMAGE (175, dropy), dropfighter(fighterframes) '440
        fighterframes = fighterframes + 1
        IF fighterframes >= 25 THEN
            animation2ran = 1
            _LIMIT 60
        END IF
    END IF

    IF audioplayed = 0 AND animation2ran = 1 THEN
        _SNDVOL collectscrapaudio, audiolevel
        _SNDPLAYCOPY collectscrapaudio
        audioplayed = 1
    END IF

    IF scrapcollected >= 8 OR _KEYDOWN(50) THEN '8
        loadlevel = 2
        levelinit = 2
        audioplayed = 0
        '_SNDSTOP levelonemusic
        '_SNDCLOSE levelonemusic
        '_SNDLOOP leveltwomusic
    END IF

    IF _KEYDOWN(51) THEN
        loadlevel = 3
        levelinit = 3
        audioplayed = 0
    END IF

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB level2 '=======================================================================================SUB LEVEL 2

    IF audioplayed = 0 THEN
        _SNDVOL enemyincomingaudio, audiolevel
        _SNDPLAYCOPY enemyincomingaudio
        audioplayed = 1
    END IF
    explosions___MISC ' - if placed here, no screen glitch but shots are under the fighters
    movebackgroundscrap___MISC

    moveplayer___PLAYER

    movescrap___MISC

    scraphitdetect___PLAYER

    fireweapon___PLAYER

    IF scrapstormscript = 1 THEN
        scrapstorm___ENEMY
    END IF

    IF laserstormscript = 1 THEN
        laserstorm___ENEMY
    END IF

    IF cruisersdown >= (cruisers_active_wave_zero / 2) AND fighterwave = 0 THEN ' - launch second fighter wave if all cruisers shot down
        fighterwave = 1 ' - new wave of fighters
        numall = numall + fighters_active_wave_one
    END IF

    IF fightersdown >= fighters_active_wave_zero + fighters_active_wave_one AND fighterwave = 1 THEN
        fighterwave = 2
    END IF

    IF fightersdown >= (fighters_active_wave_zero / 2) AND bomberwave = 0 THEN ' - launch bombers if over half of first wave fighters shot down
        bomberwave = 1
        numall = numall + bombers_active_wave_one
        bomberscanmove = 1
    END IF

    IF (((fightersdown = fighters_active_wave_zero) OR (bombersdown = bombers_active_wave_zero))) AND cruiserwave = 0 THEN ' - launch cruisers if all bombers or fighters shot down
        cruiserwave = 1 ' leave out to work
        numall = numall + cruisers_active_wave_zero
        cruiserscanmove = 1
    END IF

    IF cruiserscanmove = 1 THEN
        FOR i = 1 TO numcruisers ' - cruisers need to be on background layer
            IF cruisers(i).FIRING = 0 THEN
                resetcruisers___ENEMY
            END IF
        NEXT
        movecruisers___ENEMY
        cruisershots___ENEMY
        cruiserhitdetection___PLAYER
    END IF

    IF bomberscanmove = 1 THEN
        FOR i = 1 TO numbombers ' - bombers need to be on middle layer
            IF bshot(i).RANGE = 0 THEN
                resetbombers___ENEMY
            END IF
        NEXT
        movebombers___ENEMY
        bombershots___ENEMY 'if you turn off the bombers will never respawn
        bomberhitdetection___PLAYER
    END IF

    IF fighterscanmove = 1 THEN
        FOR inf = 1 TO numfighters ' - fighters need to be on foreground layer
            IF fighters(inf).FIRING = 0 THEN
                resetfighters___ENEMY
            END IF
        NEXT
        movefighters___ENEMY
        fightershots___ENEMY
        fighterhitdetection___PLAYER
    END IF

    IF (fighterwave = 2 AND bomberwave = 1 AND cruiserwave = 1) OR scrapcollected = numscrap THEN
        audioplayed = 0
        loadlevel = 3
        levelinit = 3
        resetfighters___ENEMY
        resetbombers___ENEMY
        resetcruisers___ENEMY
    END IF

    IF _KEYDOWN(51) THEN
        loadlevel = 3
        levelinit = 3
        audioplayed = 0
    END IF

    '_PUTIMAGE (25, 100), testunit 'TEST

END SUB

SUB level3 '=====================================================================SUB LEVEL3
    IF audioplayed = 0 THEN ' - mute for demo
        _SNDVOL enemyincomingaudio, audiolevel
        _SNDPLAYCOPY enemyincomingaudio
        audioplayed = 1
    END IF

    movebackgroundscrap___MISC

    moveplayer___PLAYER

    movescrap___MISC

    scraphitdetect___PLAYER

    fireweapon___PLAYER

    IF scrapstormscript = 1 THEN
        scrapstorm___ENEMY
    END IF

    IF laserstormscript = 1 THEN
        laserstorm___ENEMY
    END IF

    generichitdetection___PLAYER

    IF cruiserscanmove = 1 THEN
        FOR i = 1 TO numcruisers ' - cruisers need to be on background layer
            IF cruisers(i).FIRING = 0 THEN
                resetcruisers___ENEMY
            END IF
        NEXT
        movecruisers___ENEMY
        cruisershots___ENEMY
        cruiserhitdetection___PLAYER
    END IF

    IF bomberscanmove = 1 THEN
        FOR i = 1 TO numbombers ' - bombers need to be on middle layer
            IF bshot(i).RANGE = 0 THEN
                resetbombers___ENEMY
            END IF
        NEXT
        movebombers___ENEMY
        bombershots___ENEMY 'if you turn off the bombers will never respawn
        bomberhitdetection___PLAYER
    END IF

    IF fighterscanmove = 1 THEN
        FOR inf = 1 TO numfighters ' - fighters need to be on foreground layer
            IF fighters(inf).FIRING = 0 THEN
                resetfighters___ENEMY
            END IF
        NEXT
        movefighters___ENEMY
        fightershots___ENEMY
        fighterhitdetection___PLAYER
    END IF

    movebattleships___ENEMY

    resetbships___ENEMY

    bshipshots___ENEMY

    bshiphitdetection___PLAYER

END SUB

'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

'                                               !!!  SETUP subroutines !!!

'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB titlescreen___SETUP '=======================================================SUB TITLE SCREEN SETUP

    movebackgroundscrap___MISC

    moveplayer___PLAYER ' - moveplayer sub modified for the title screen

    movescrap___MISC

    _PUTIMAGE (175, dropy), titleunit 'TEST  y600

    setletters___MISC

    FOR i = 1 TO lettersum
        _PUTIMAGE (lscrap(i).X, lscrap(i).Y), lscrap(i).PIC
    NEXT

    _FONT gamefontlrg
    LOCATE 4, 300: PRINT "40wattstudio presents"
    _FONT gamefontmed
    LOCATE 20, 350: PRINT "Use Arrow Keys to Select"
    LOCATE 21, 350: PRINT " Press ENTER to confirm"
    _FONT gamefontlrg
    SELECT CASE menucase
        CASE 1 '                          - text to be displayed no matter what
            LOCATE 15, 380: PRINT "START GAME"

            IF soundlevel <= 0 THEN LOCATE 16, 380: PRINT "sound level: <-- OFF -->" '                           - sound menu item

            IF soundlevel >= 10 THEN LOCATE 16, 380: PRINT "sound level: <-- max -->"

            IF soundlevel >= 1 AND soundlevel < 10 THEN LOCATE 16, 380: PRINT "sound level: <-- "; soundlevel; " -->" ' multiplied by 10. divide by 10 before playing sound

            IF audiolevel <= 0 THEN LOCATE 17, 380: PRINT "audio level: <-- OFF -->" '                           - audio menu item

            IF audiolevel >= 10 THEN LOCATE 17, 380: PRINT "audio level: <-- max -->"

            IF audiolevel >= 1 AND audiolevel < 10 THEN LOCATE 17, 380: PRINT "audio level: <-- "; audiolevel; " -->" ' multiplied by 10. divide by 10 before playing sound

            LOCATE 18, 380: PRINT "CREDITS"
        CASE 3
            CLS
            clearletters___MISC
            credits___MISC
            menucase = 1
            setletters___MISC
    END SELECT

    IF menucase = 1 THEN
        _PUTIMAGE (selector.X, selector.Y), selectorpic

        k3 = _KEYHIT '                     - MOVE UP
        IF k3 = 18432 THEN
            selector.Y = selector.Y - 30
            IF selector.Y <= 450 THEN
                selector.Y = 450
            END IF
        END IF

        IF k3 = 20480 THEN '               - MOVE DOWN
            selector.Y = selector.Y + 30
            IF selector.Y >= 540 THEN '605
                selector.Y = 540
            END IF
        END IF

        IF (selector.Y = 450 AND _KEYDOWN(13)) OR _KEYDOWN(49) THEN 'start game if ENTER or 1
            clearletters___MISC
            loadlevel = 1
            levelinit = 1
            soundlevel = soundlevel / 10 ' - allows sound to play at proper volume level
        END IF
        ' ------------- ADJUST SOUND
        IF selector.Y = 480 AND k3 = 19200 THEN '          - left for volume down
            soundlevel = soundlevel - 1
            IF soundlevel <= 0 THEN soundlevel = 0
            IF issoundon = 1 THEN
                _SNDVOL singlelasersound, soundlevel / 10
                _SNDPLAYCOPY singlelasersound
            END IF
        END IF

        IF selector.Y = 480 AND k3 = 19712 THEN '          - right for volume up
            soundlevel = soundlevel + 1
            IF soundlevel >= 10 THEN soundlevel = 10
            IF issoundon = 1 THEN
                _SNDVOL singlelasersound, soundlevel / 10
                _SNDPLAYCOPY singlelasersound
            END IF
        END IF
        ' ------------- ADJUST AUDIO
        IF selector.Y = 510 AND k3 = 19200 THEN '          - left for volume down
            audiolevel = audiolevel - 1
            IF audiolevel <= 0 THEN audiolevel = 0
            IF issoundon = 1 THEN
                _SNDVOL singlelaseraudio, audiolevel / 10
                _SNDPLAYCOPY singlelaseraudio
            END IF
        END IF

        IF selector.Y = 510 AND k3 = 19712 THEN '          - right for volume up
            audiolevel = audiolevel + 1
            IF audiolevel >= 10 THEN audiolevel = 10
            IF issoundon = 1 THEN
                _SNDVOL singlelaseraudio, audiolevel / 10
                _SNDPLAYCOPY singlelaseraudio
            END IF
        END IF

        IF selector.Y = 540 AND _KEYDOWN(13) THEN menucase = 3 ' - go to credits screen if ENTER  '605

    END IF

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB freeimages___SETUP '===========================================================SUB FREE IMAGES SETUP

    'IF levelpic1 < -1 THEN _FREEIMAGE levelpic1
    IF player.PIC < -1 THEN _FREEIMAGE player.PIC
    IF playerdmg1 < -1 THEN _FREEIMAGE playerdmg1
    IF playerdmg2 < -1 THEN _FREEIMAGE playerdmg2
    IF playerdmg3 < -1 THEN _FREEIMAGE playerdmg3
    IF playerdmg4 < -1 THEN _FREEIMAGE playerdmg4
    IF playerdmg5 < -1 THEN _FREEIMAGE playerdmg5
    IF boss1.PIC < -1 THEN _FREEIMAGE boss1.PIC
    IF fightershotpic < -1 THEN _FREEIMAGE fightershotpic
    IF cruisershotpic < -1 THEN _FREEIMAGE cruisershotpic
    IF cruiserunit < -1 THEN _FREEIMAGE cruiserunit
    IF rapidlaserpic < -1 THEN _FREEIMAGE rapidlaserpic

    '_SNDSTOP levelonemusic
    '_SNDSTOP leveltwomusic
    '_SNDCLOSE levelonemusic
    '_SNDCLOSE leveltwomusic

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB loadallgameassets___SETUP '================================================SUB LOAD ALL GAME ASSETS SETUP

    ' ---------------------- load sounds

    playerdiedsound = _SNDOPEN("SCRAPSHIP\x\sfx\playerexplosion.mp3")
    singlelasersound = _SNDOPEN("SCRAPSHIP\x\sfx\singlelaser.mp3")
    multilasersound = _SNDOPEN("SCRAPSHIP\x\sfx\rapidlasersingle.mp3")
    scrapcannonsound = _SNDOPEN("SCRAPSHIP\x\sfx\scrapcannonsingle.mp3")
    scrapcollectedsound = _SNDOPEN("SCRAPSHIP\x\sfx\collectingscrap.mp3")
    'levelonemusic = _SNDOPEN("SCRAPSHIP\x\music\Level1.mp3", "sync,vol")
    'leveltwomusic = _SNDOPEN("SCRAPSHIP\x\music\Level2.mp3", "sync,vol")
    enemylasersound = _SNDOPEN("SCRAPSHIP\x\sfx\shot.wav")
    singlelaseraudio = _SNDOPEN("SCRAPSHIP\x\sfx\singlelaseraudio.mp3")
    rapidlaseraudio = _SNDOPEN("SCRAPSHIP\x\sfx\rapidlaseraudio.mp3")
    healthcriticalaudio = _SNDOPEN("SCRAPSHIP\x\sfx\healthcriticalaudio.mp3")
    collectscrapaudio = _SNDOPEN("SCRAPSHIP\x\sfx\collectscrapaudio.mp3")
    enemyincomingaudio = _SNDOPEN("SCRAPSHIP\x\sfx\enemyincomingaudio.mp3")
    greatpilotingaudio = _SNDOPEN("SCRAPSHIP\x\sfx\greatpilotingaudio.mp3")
    notbadaudio = _SNDOPEN("SCRAPSHIP\x\sfx\notbadaudio.mp3")
    'thatllhelpaudio = _SNDOPEN("SCRAPSHIP\x\sfx\thatllhelp.mp3")

    soundlength = _SNDLEN(multilasersound)

    ' -------------------- load graphics

    'testunit = _LOADIMAGE("SCRAPSHIP\x\gfx\FogOfWarTest.png") 'test.png")
    titleunit = _LOADIMAGE("SCRAPSHIP\x\gfx\titleship.png")
    selectorpic = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaPlayersmall.png")
    player.PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaPlayer2.png")
    playerbankleft = _LOADIMAGE("SCRAPSHIP\x\gfx\PlayerBankLeft.png")
    playerbankright = _LOADIMAGE("SCRAPSHIP\x\gfx\PlayerBankRight.png")
    playerdmg1 = _LOADIMAGE("SCRAPSHIP\x\gfx\Shooterdmg1.png")
    playerdmg2 = _LOADIMAGE("SCRAPSHIP\x\gfx\Shooterdmg2.png")
    playerdmg3 = _LOADIMAGE("SCRAPSHIP\x\gfx\Shooterdmg3.png")
    playerdmg4 = _LOADIMAGE("SCRAPSHIP\x\gfx\Shooterdmg4.png")
    playerdmg5 = _LOADIMAGE("SCRAPSHIP\x\gfx\Shooterdmg5.png")
    'boss1.PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\bossTEST.png")
    cruisershotpic = _LOADIMAGE("SCRAPSHIP\x\gfx\emultishot_15x25.png")
    bombershotpic1 = _LOADIMAGE("SCRAPSHIP\x\gfx\bomb40x401.png")
    bombershotpic2 = _LOADIMAGE("SCRAPSHIP\x\gfx\bomb40x402.png")
    bombershotpic3 = _LOADIMAGE("SCRAPSHIP\x\gfx\bomb40x403.png")
    fighterunit = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaFighter.png")
    fighterdmg1 = _LOADIMAGE("SCRAPSHIP\x\gfx\fighterdmg1.png")
    fighterdmg2 = _LOADIMAGE("SCRAPSHIP\x\gfx\fighterdmg2.png")
    fighterdmg3 = _LOADIMAGE("SCRAPSHIP\x\gfx\fighterdmg3.png")
    bomberunit = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaBomber118x98.png") 'LucaBomber120x80.png")
    bomberdmg1 = _LOADIMAGE("SCRAPSHIP\x\gfx\bomberdmg1.png")
    bomberdmg2 = _LOADIMAGE("SCRAPSHIP\x\gfx\bomberdmg2.png")
    bomberdmg3 = _LOADIMAGE("SCRAPSHIP\x\gfx\bomberdmg3.png")
    cruiserunit = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaCruiser1.png")
    cruiserdmg1 = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaCruiser2.png")
    cruiserdmg2 = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaCruiser3.png")
    cruiserdmg3 = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaCruiser4.png")
    carrierunit = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaCarrier.png") 'LucaCarrierglowing.png")
    'ssunit = _LOADIMAGE("SCRAPSHIP\x\gfx\spacetop.png")
    carriersideunit = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaCarriersideview.png")
    bshipunit = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaBshipEevee.png")
    bshipdmg1 = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaBshipEdmg1.png")
    bshipdmg2 = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaBshipEdmg2.png")
    bshipdmg3 = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaBshipEdmg3.png")
    incomingtext = _LOADIMAGE("SCRAPSHIP\x\gfx\incoming.png")
    gameovertext = _LOADIMAGE("SCRAPSHIP\x\gfx\gameover.png")
    creditsinsta = _LOADIMAGE("SCRAPSHIP\x\gfx\credits.png")
    iconspeed = _LOADIMAGE("SCRAPSHIP\x\gfx\iconshotspeed.png")
    iconwidth = _LOADIMAGE("SCRAPSHIP\x\gfx\iconshotwidth.png")
    icondamage = _LOADIMAGE("SCRAPSHIP\x\gfx\icondamage.png")
    iconscrapstorm = _LOADIMAGE("SCRAPSHIP\x\gfx\iconscrapstorm.png")
    iconsinglelaser = _LOADIMAGE("SCRAPSHIP\x\gfx\iconsinglelaser.png")
    iconrapidlaser = _LOADIMAGE("SCRAPSHIP\x\gfx\iconrapidlaser.png")
    iconscrapcannon = _LOADIMAGE("SCRAPSHIP\x\gfx\iconscrapcannon.png")
    statguide = _LOADIMAGE("SCRAPSHIP\x\gfx\statguide.png")
    laserstorm = _LOADIMAGE("SCRAPSHIP\x\gfx\laserstorm.png")
    sshotpic = _LOADIMAGE("SCRAPSHIP\x\gfx\sshot1.png")

    FOR i = 1 TO bscrap ' ----- load background scrap
        RANDOMIZE TIMER
        SELECT CASE i ' - cycle through all the background scrap and assign imaeges
            CASE IS <= 20
                bgscrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\5x5bscrap1.png")
                bgscrap(i).X = INT(RND * 1500) + 1
                bgscrap(i).Y = INT(RND * 200) + 500
            CASE 20 TO 30
                bgscrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\7x7bscrap1.png")
                bgscrap(i).X = INT(RND * 1500) + 1
                bgscrap(i).Y = INT(RND * 250) + 500
            CASE IS > 30
                bgscrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\10x10bscrap1.png")
                bgscrap(i).X = INT(RND * 1500) + 1
                bgscrap(i).Y = INT(RND * 225) + 500
        END SELECT
    NEXT

    FOR i = 1 TO numscrap ' ---- load foreground scrap
        RANDOMIZE TIMER
        randrotate = INT(RND * 3) + 1
        SELECT CASE i ' - cycle through 12 - 32 foreground scrap and assign images
            CASE IS <= 6
                IF randrotate = 4 THEN scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\30x30scrap1.png")
                IF randrotate = 3 THEN scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\30x30scrap1r1.png")
                IF randrotate = 2 THEN scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\30x30scrap1r2.png")
                IF randrotate = 1 THEN scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\30x30scrap1r3.png")
                scrap(i).WIDTH = 30
                scrap(i).HEIGHT = 30
                scrap(i).X = INT(RND * win.WIDTH) + 1
                scrap(i).Y = INT(RND * win.HEIGHT) + scrap(i).HEIGHT
                scrap(i).COLLECTED = 0
            CASE 7 TO 11
                IF randrotate = 4 THEN scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\45x45scrap1.png")
                IF randrotate = 3 THEN scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\45x45scrap1r1.png")
                IF randrotate = 2 THEN scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\45x45scrap1r2.png")
                IF randrotate = 1 THEN scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\45x45scrap1r2.png")
                scrap(i).WIDTH = 45
                scrap(i).HEIGHT = 45
                scrap(i).X = INT(RND * win.WIDTH) + 1
                scrap(i).Y = INT(RND * win.HEIGHT) + scrap(i).HEIGHT
                scrap(i).COLLECTED = 0
            CASE IS > 11
                IF randrotate = 4 THEN scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\55x55scrap1.png")
                IF randrotate = 3 THEN scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\55x55scrap1r1.png")
                IF randrotate = 2 THEN scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\55x55scrap1r2.png")
                IF randrotate = 1 THEN scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\55x55scrap1r3.png")
                scrap(i).WIDTH = 55
                scrap(i).HEIGHT = 55
                scrap(i).X = INT(RND * win.WIDTH) + 1
                scrap(i).Y = INT(RND * win.HEIGHT) + scrap(i).HEIGHT
                scrap(i).COLLECTED = 0
        END SELECT
    NEXT

    FOR i = 1 TO scrapcol
        RANDOMIZE TIMER
        randrotate = INT(RND * 3) + 1
        SELECT CASE i ' - cycle through 12 - 32 foreground scrap and assign images
            CASE IS <= 32
                IF randrotate = 4 THEN scrapstorm(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\30x30scrap1.png")
                IF randrotate = 3 THEN scrapstorm(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\30x30scrap1r1.png")
                IF randrotate = 2 THEN scrapstorm(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\30x30scrap1r2.png")
                IF randrotate = 1 THEN scrapstorm(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\30x30scrap1r3.png")
                scrapstorm(i).WIDTH = 30
                scrapstorm(i).HEIGHT = 30
                scrapstorm(i).X = INT(RND * win.WIDTH) + 1
                scrapstorm(i).Y = INT(RND * win.HEIGHT) + win.HEIGHT + 10
            CASE 33 TO 67
                IF randrotate = 4 THEN scrapstorm(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\45x45scrap1.png")
                IF randrotate = 3 THEN scrapstorm(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\45x45scrap1r1.png")
                IF randrotate = 2 THEN scrapstorm(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\45x45scrap1r2.png")
                IF randrotate = 1 THEN scrapstorm(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\45x45scrap1r2.png")
                scrapstorm(i).WIDTH = 45
                scrapstorm(i).HEIGHT = 45
                scrapstorm(i).X = INT(RND * win.WIDTH) + 1
                scrapstorm(i).Y = INT(RND * win.HEIGHT) + win.HEIGHT + 10
            CASE IS > 67
                IF randrotate = 4 THEN scrapstorm(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\55x55scrap1.png")
                IF randrotate = 3 THEN scrapstorm(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\55x55scrap1r1.png")
                IF randrotate = 2 THEN scrapstorm(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\55x55scrap1r2.png")
                IF randrotate = 1 THEN scrapstorm(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\55x55scrap1r3.png")
                scrapstorm(i).WIDTH = 55
                scrapstorm(i).HEIGHT = 55
                scrapstorm(i).X = INT(RND * win.WIDTH) + 1
                scrapstorm(i).Y = INT(RND * win.HEIGHT) + win.HEIGHT + 10
        END SELECT

    NEXT

    fd = 1
    DO WHILE fd < fighterdrop
        fdrop$ = "SCRAPSHIP\x\gfx\fightertest\" + LTRIM$(STR$(fd)) + ".png"
        dropfighter(fd) = _LOADIMAGE(fdrop$)
        fd = fd + 1
    LOOP

    fc = 1
    DO WHILE fc <= fourcount
        rapidshot$ = "SCRAPSHIP\x\gfx\multishot" + LTRIM$(STR$(fc)) + ".png"
        drawrapid(fc) = _LOADIMAGE(rapidshot$)
        singleshot$ = "SCRAPSHIP\x\gfx\shot" + LTRIM$(STR$(fc)) + ".png"
        drawsingle(fc) = _LOADIMAGE(singleshot$)
        scannon$ = "SCRAPSHIP\x\gfx\sshot" + LTRIM$(STR$(fc)) + ".png"
        drawscannon(fc) = _LOADIMAGE(scannon$)
        eshot$ = "SCRAPSHIP\x\gfx\eshot" + LTRIM$(STR$(fc)) + ".png"
        draweshot(fc) = _LOADIMAGE(eshot$)
        fc = fc + 1
    LOOP

    rl = 1
    DO WHILE rl <= fivecount '           - load fivecount graphics
        blast$ = "SCRAPSHIP\x\gfx\exp" + LTRIM$(STR$(rl)) + ".png"
        blastgif(rl) = _LOADIMAGE(blast$)
        shield$ = "SCRAPSHIP\x\gfx\LucaFightershield" + LTRIM$(STR$(rl)) + ".png"
        shieldgif(rl) = _LOADIMAGE(shield$)
        rl = rl + 1
    LOOP

    i = 1
    DO WHILE i < maxrotation '          - load planet rotation graphics
        winpath$ = "SCRAPSHIP\x\gfx\eevee\" + LTRIM$(STR$(i)) + ".png"
        planetrotation(i) = _LOADIMAGE(winpath$) '
        i = i + 1 'x for faster testing  3 for normal
    LOOP

    de = 1
    DO WHILE de <= deflectcount '           - load deflection graphics
        deflect$ = "SCRAPSHIP\x\gfx\shieldhit" + LTRIM$(STR$(de)) + ".png"
        deflectgif(de) = _LOADIMAGE(deflect$)
        de = de + 1
    LOOP

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB basicsettings___SETUP '==========================================================SUB BASIC SETTINGS SETUP

    CLS '                        - gets rid of printed text
    RANDOMIZE TIMER

    win.X = -95
    win.Y = 100
    testx = -200 'TEST
    testy = -200
    win.TOP = 0
    win.BOTTOM = win.HEIGHT
    win.LEFT = 0
    win.RIGHT = win.WIDTH

    selector.X = 340
    selector.Y = 450

    menucase = 1

    player.WIDTH = 60 '55     'not sure why these got changed
    player.HEIGHT = 60 '52
    player.X = (win.WIDTH / 2) - (player.WIDTH / 2) ' window middle - player middle
    player.Y = (win.BOTTOM + (win.HEIGHT / 2)) / 2
    player.HEALTH = 100
    player.SPEED = 5 '2 raise higher if game starts to LAG
    player.KILLED = 0

    fighters_active_wave_zero = 0
    bombers_active_wave_zero = 0
    cruisers_active_wave_zero = 0
    fighterscanmove = 1
    bomberscanmove = 0
    cruiserscanmove = 0

    '--------------------------------------ARRAYED TYPE DATA

    FOR i = 1 TO numcarriers
        carriers(i).WIDTH = 400
        carriers(i).HEIGHT = 772
        carriers(i).X = INT(RND * (win.WIDTH - carriers(i).WIDTH))
        carriers(i).Y = -800 'INT(RND * win.HEIGHT - carriers(i).HEIGHT) * -1
        carriers(i).STOPPINGY = -100 '300
    NEXT

    FOR i = 1 TO numcruisers
        cruisers(i).ACTIVE = ((INT(RND * 2) + 1) - 1) 'generates 0 or 1
        IF cruisers(i).ACTIVE = 0 THEN
            cruisers_active_wave_zero = cruisers_active_wave_zero + 1
            cruiserwave = 0
        END IF
        IF cruisers(i).ACTIVE = 1 THEN
            cruisers_active_wave_one = cruisers_active_wave_one + 1
        END IF
    NEXT

    FOR i = 1 TO numbships
        bships(i).HEIGHT = 198
        bships(i).WIDTH = 482
        bships(i).X = -500
        bships(i).Y = 0
        bships(i).STOPPINGX = 300
        bships(i).HEALTH = 3000
        bships(i).KILLED = 0
    NEXT

    FOR i = 1 TO numcruisers
        cruisers(i).WIDTH = 140
        cruisers(i).HEIGHT = 200
        cruisers(i).X = INT(RND * (win.WIDTH - cruisers(i).WIDTH))
        cruisers(i).Y = (INT(RND * (win.HEIGHT / 2)) * -1) - (cruisers(i).HEIGHT + 10)
        cruisers(i).HEALTH = 1500
        cruisers(i).KILLED = 0
        cruisers(i).VISIBLE = 0
        cruisers(i).STOPPED = 0
        cruisers(i).STOPPINGY = INT(RND * 100) 'cruisers(i).HEIGHT)
        cruisers(i).CRUISERSPEED = 30 ' - high value allows cruisers to "warp" in
        cruisers(i).FIRING = 0
        cruisers(i).DISTANCEX = 0
        cruisers(i).ODDSOFACTIVE = 0
        cruisers(i).PLAYERPOSITION = 3
        cruisers(i).PLAYERABOVE = 3
        cruisers(i).ICONPICKEDUP = 1
        cruisers(i).RANDOMICON = 0
    NEXT

    FOR i = 1 TO numbombers
        bombers(i).ACTIVE = ((INT(RND * 2) + 1) - 1) 'generates 0 or 1
        IF bombers(i).ACTIVE = 0 THEN
            bombers_active_wave_zero = bombers_active_wave_zero + 1
            bomberwave = 0
        END IF
        IF bombers(i).ACTIVE = 1 THEN
            bombers_active_wave_one = bombers_active_wave_one + 1
        END IF
    NEXT

    FOR i = 1 TO numbombers
        bombers(i).WIDTH = 118
        bombers(i).HEIGHT = 98
        bombers(i).X = (win.RIGHT + (bombers(i).WIDTH * i)) ' + bombers(i).WIDTH)
        bombers(i).Y = INT(RND * 300) * -1 '100
        bombers(i).XKILLBOX = bombers(i).X + (bombers(i).WIDTH / 2) 'TEST FOR SHOT ORIGIN
        bombers(i).YKILLBOX = bombers(i).Y + (bombers(i).HEIGHT / 2)
        bombers(i).HEALTH = 600
        bombers(i).KILLED = 0
        bombers(i).BOMBERSPEED = INT(RND * 2) + 2 ' - max speed of 3  ' 4
        bombers(i).ARBPIC = 0
        bombers(i).ICONPICKEDUP = 1
        bombers(i).RANDOMICON = 0
        bshot(i).RANGE = 0
    NEXT

    FOR inf = 1 TO numfighters ' - determines how many of the 30 fighters are active
        fighters(inf).ACTIVE = (INT(RND * 2) + 1) - 1 'generates 0 or 1
        IF fighters(inf).ACTIVE = 0 THEN
            fighters_active_wave_zero = fighters_active_wave_zero + 1
            fighterwave = 0
        END IF
        IF fighters(inf).ACTIVE = 1 THEN
            fighters_active_wave_one = fighters_active_wave_one + 1
        END IF
    NEXT

    FOR inf = 1 TO numfighters
        fighters(inf).WIDTH = 100
        fighters(inf).HEIGHT = 60
        fighters(inf).X = INT(RND * win.WIDTH - fighters(inf).WIDTH) + fighters(inf).WIDTH
        fighters(inf).Y = INT(RND * ((win.HEIGHT * 2) - fighters(inf).HEIGHT) + 1) * -1 ' multiply win.height by 2 for spacing between fighters
        fighters(inf).HEALTH = 300
        fighters(inf).KILLHIT = 0
        fighters(inf).GRAZEHIT = 0
        fighters(inf).SHOTX = 0
        fighters(inf).SHOTY = 0
        fighters(inf).KILLED = 0
        fighters(inf).BLASTNUM = 1
        fighters(inf).FIGHTERSPEED = INT(RND * 2) + 2 ' - max speed of 4
        fighters(inf).FIRING = 0
        fighters(inf).SHIELDHEALTH = 200
        fighters(inf).SHIELDON = 0
        fighters(inf).ICONPICKEDUP = 1
        fighters(inf).RANDOMICON = 0
        fightersicon(inf).WIDTH = 100
        fightersicon(inf).HEIGHT = 60
        fightersicon(inf).X = fighters(inf).X
        fightersicon(inf).Y = fighters(inf).Y
        fightersicon(inf).ICONPICKEDUP = fighters(inf).ICONPICKEDUP
        fightersicon(inf).KILLED = fighters(inf).KILLED
        fightersicon(inf).SHIELDON = fighters(inf).SHIELDON
        fightersicon(inf).ACTIVE = fighters(inf).ACTIVE
        fightersicon(inf).ICONREADY = 0
        fightersicon(inf).VALUESCOPIED = 0
    NEXT

    FOR i = 0 TO maxshots ' KEEP - this part prevents the fighter shields from getting destroyed off-screen
        xshot(i).X = -500
        xshot(i).Y = -500
        xshot(i).ACTIVE = FALSE
        batshot(i).X = -500
        batshot(i).Y = -500
        batshot(i).ACTIVE = FALSE
    NEXT

    FOR i = 1 TO laserstormcount
        lstorm(i).WIDTH = 20
        lstorm(i).HEIGHT = 100
        lstorm(i).X = INT(RND * (win.WIDTH - lstorm(i).WIDTH))
        lstorm(i).Y = INT((RND * 1500) + 1000) * -1
        lstorm(i).SPEED = 10
        lstorm(i).DAMAGE = 75
    NEXT

    '-------------------------------------SCRIPT DATA

    foregroundscrapscriptran = 0
    backgroundscrapscriptran = 0
    cruiserstopscriptran = 0
    rotationscript = 0
    healthscriptran = 0
    animation1ran = 0
    animation2ran = 0
    scrapstormscript = 0
    laserstormscript = 0

    '-------------------------------------SHOTDOWN DATA
    shotdown = 0
    fightersdown = 0
    bombersdown = 0
    cruisersdown = 0

    '-------------------------------------OTHER DATA
    soundlevel = 0.2 '0.3
    soundlevel = soundlevel * 10
    audiolevel = 0.5
    audiolevel = audiolevel * 10
    'musiclevel = 0.3
    'musiclevel = musiclevel * 10
    playerkeydelay = 0
    bshipkeydelay = 0
    scrapcollected = 0
    loadlevel = 0
    issoundon = 1
    isaudioon = 1
    playermovingcase = 2
    iterations = 0
    weapontype = 1 ' rapid laser
    singlelaserupgrade = 0
    fighterlaserupgrade = 1
    rapidlaserupgrade = 3 '1 by default   3 for rapid testing
    scrapcannonupgrade = 0
    endcredits = 0
    gamepaused = 0
    gamefps = 60
    audioplayed = 0
    baseheight = 20
    basewidth = 10
    basedamage = 40
    upgradeheight = 0
    upgradewidth = 0
    upgradespeed = 0
    upgradedamage = 0
    shotnum = 1 'This value allows the player shot pictures to change by starting at 1
    eshotnum = 1 ' this value allows the fighter shot pictures to change by starting at 1
    decreasekeydelay = 0
    scrapoffscreen = 0
    lasersoffscreen = 0
    eupgradeheight = 0
    eupgradewidth = 0
    eupgradespeed = 0
    eupgradedamage = 0
    eupgradewidth = 0
    shothit = 0
    shotfired = 0
    hitrate = 0

    rotationcount = 0 'TEST
    yiterations = 0
    dropy = 600
    blastnum = 1 ' - has to be 1 for explosions to work
    numall = fighters_active_wave_zero

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB overlapchecks___SETUP '========================================================================SUB CRUISER OVERLAP SETUP

    FOR i = 1 TO numcruisers
        IF (cruisers(i).X >= cruisers(i - 1).X) AND (cruisers(i).X + cruisers(i).WIDTH <= cruisers(i - 1).X + cruisers(i - 1).WIDTH) THEN
            DO
                cruisers(i).X = cruisers(i).X - 1
            LOOP UNTIL (cruisers(i).X < cruisers(i - 1).X) AND (cruisers(i).X + cruisers(i).WIDTH <= cruisers(i - 1).X + cruisers(i - 1).WIDTH)
        END IF
    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB newscreen___SETUP '=====================================================================SUB NEW SCREEN SETUP

    CLS
    win.WIDTH = 1000
    win.HEIGHT = 1000
    win.COLORS = 32
    SCREEN _NEWIMAGE(win.WIDTH, win.HEIGHT, win.COLORS)

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

'                                               !!!  PLAYER subroutines !!!

'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB moveplayer___PLAYER '===============================================================================SUB MOVE PLAYER

    IF rotationscript = 0 THEN '             - let planet rotate first
        irotation = 1
        rotationscript = 1
    END IF

    yiterations = yiterations + 1
    IF yiterations >= 25 THEN '100
        win.Y = win.Y + 1
        IF yiterations > 25 THEN yiterations = 0
    END IF
    IF iterations = 300 THEN ' 200
        irotation = irotation + 1 '20 for faster testing   2 for normal
        rotationcount = rotationcount + 1
        IF irotation >= maxrotation THEN irotation = 1
        iterations = 0
    END IF
    _PUTIMAGE (win.X, win.Y), planetrotation(irotation)
    iterations = iterations + 1

    player.XKILLBOX = player.X + (player.WIDTH / 2)
    player.YKILLBOX = player.Y + (player.HEIGHT / 2)

    IF loadlevel > 0 THEN

        playermovingcase = 2 '     - used to determine if player is 1 banking left / 2 level / 3 banking right

        IF _KEYDOWN(CVI(CHR$(0) + "K")) AND player.X > win.LEFT THEN '    - MOVE LEFT
            player.X = player.X - player.SPEED
            playermovingcase = 1
            win.X = win.X + 1
            'testx = testx + 1 ' TEST fog of war effect
        END IF

        IF _KEYDOWN(CVI(CHR$(0) + "M")) AND player.X + player.WIDTH < win.RIGHT THEN '  - MOVE RIGHT
            player.X = player.X + player.SPEED
            win.X = win.X - 1
            'testx = testx - 1
            playermovingcase = 3
        END IF

        IF _KEYDOWN(CVI(CHR$(0) + "H")) AND player.Y > win.TOP THEN '  - MOVE UP
            player.Y = player.Y - player.SPEED
            win.Y = win.Y + 1 '-
            'testy = testy + 1
        END IF

        IF _KEYDOWN(CVI(CHR$(0) + "P")) AND player.Y + player.HEIGHT < win.BOTTOM THEN '   - MOVE DOWN
            player.Y = player.Y + player.SPEED
            win.Y = win.Y - 1 '+
            'testy = testy - 1
        END IF

    END IF

    IF player.X <= win.LEFT THEN player.X = win.LEFT '                                 - set left boundary
    IF player.X + player.WIDTH >= win.RIGHT THEN player.X = win.RIGHT - player.WIDTH ' - set right boundary
    IF player.Y <= win.TOP THEN player.Y = win.TOP '                                   - set top boundary
    IF player.Y >= win.BOTTOM THEN player.Y = win.BOTTOM - player.HEIGHT '             - set bottom boundary

    IF loadlevel > 0 AND animation1ran = 1 AND animation2ran = 1 THEN '                    - player ship banks and stays in front of planet

        SELECT CASE playermovingcase
            CASE 1
                player.WIDTH = 50
                player.HEIGHT = 58
                _PUTIMAGE (player.X, player.Y), playerbankleft
            CASE 3
                player.WIDTH = 50
                player.HEIGHT = 58
                _PUTIMAGE (player.X, player.Y), playerbankright
            CASE ELSE
                player.WIDTH = 60
                player.HEIGHT = 60
                _PUTIMAGE (player.X, player.Y), player.PIC
        END SELECT
        '_PUTIMAGE (testx, testy), testunit 'TEST (fog of war effect)

    END IF

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB playerhitanimation___PLAYER '================================================== SUB PLAYER HIT ANIMATION PLAYER

    blastnum = 1
    DO WHILE blastnum < fivecount
        FOR arb = 1 TO 15 '
            _PUTIMAGE (INT(RND * player.WIDTH) + player.X, player.Y + INT(RND * player.HEIGHT)), blastgif(blastnum) ' - place random blasts on the player
        NEXT arb
        blastnum = blastnum + 1
    LOOP

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB generichitdetection___PLAYER '========================================================== SUB GENERIC HIT DETECTION PLAYER

    numshots = 0
    DO
        checkforactiveweapon___PLAYER
        numshots = numshots + 1
    LOOP UNTIL numshots = maxshots

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB fighterhitdetection___PLAYER '=================================================SUB FIGHTER HIT DETECTION PLAYER

    '-------------------------   MULTI SHOT HIT DETECTION   ---------------------
    numshots = 0
    DO
        checkforactiveweapon___PLAYER

        '--------------------------------------------FIGHTERS

        FOR inf = 1 TO numfighters
            RANDOMIZE TIMER
            fighters(inf).RANDOMY = INT(RND * fighters(inf).HEIGHT)

            fighters(inf).XKILLBOX = fighters(inf).X + (fighters(inf).WIDTH / 2) 'calculates hitbox coordinates
            fighters(inf).YKILLBOX = fighters(inf).Y + (fighters(inf).HEIGHT / 2)

            ' if player shot hits shield anywhere

            IF (fighters(inf).KILLED = 0) AND (fighters(inf).SHIELDON = 1) AND (xshot(numshots).X + xshot(numshots).WIDTH >= fighters(inf).X) AND (xshot(numshots).X <= fighters(inf).X + fighters(inf).WIDTH) AND (xshot(numshots).Y <= fighters(inf).Y + fighters(inf).HEIGHT) AND (xshot(numshots).Y + xshot(numshots).HEIGHT >= fighters(inf).Y) THEN
                fighters(inf).SHIELDHEALTH = fighters(inf).SHIELDHEALTH - totaldamage
                shothit = shothit + 1
                blastnum = 1
                DO WHILE blastnum < deflectcount ' - deflection animation
                    _PUTIMAGE (xshot(numshots).X, (fighters(inf).Y + fighters(inf).HEIGHT) - 10), deflectgif(blastnum)
                    blastnum = blastnum + 1
                LOOP
                xshot(numshots).X = -500 'KEEP
                xshot(numshots).Y = -500 'KEEP
                xshot(numshots).ACTIVE = FALSE
                IF fighters(inf).SHIELDHEALTH <= 0 THEN
                    fighters(inf).SHIELDON = 0
                    fighters(inf).HEIGHT = 60
                END IF

            END IF
            ' - if fighter shield is not on
            IF fighters(inf).SHIELDON = 0 THEN

                ' - if player shot hits killbox
                IF (fighters(inf).KILLED) = 0 AND (xshot(numshots).X + xshot(numshots).WIDTH >= fighters(inf).XKILLBOX) AND (xshot(numshots).X <= fighters(inf).XKILLBOX) AND (xshot(numshots).Y <= fighters(inf).YKILLBOX) AND (xshot(numshots).Y + xshot(numshots).HEIGHT >= fighters(inf).Y) THEN
                    fighters(inf).HEALTH = fighters(inf).HEALTH - extradamage
                    shothit = shothit + 1
                    blastnum = 1
                    DO WHILE blastnum < fivecount
                        _PUTIMAGE (fighters(inf).XKILLBOX, fighters(inf).YKILLBOX), blastgif(blastnum) ' - place killbox blast on the fighter
                        blastnum = blastnum + 1
                    LOOP
                    xshot(numshots).X = -500 'KEEP
                    xshot(numshots).Y = -500 'KEEP
                    xshot(numshots).ACTIVE = FALSE
                END IF

                ' - if player shot hits grey box
                IF (fighters(inf).KILLED) = 0 AND (xshot(numshots).X + xshot(numshots).WIDTH >= fighters(inf).X) AND (xshot(numshots).X <= fighters(inf).X + fighters(inf).WIDTH) AND (xshot(numshots).Y <= fighters(inf).YKILLBOX) AND (xshot(numshots).Y + xshot(numshots).HEIGHT >= fighters(inf).Y) THEN
                    fighters(inf).HEALTH = fighters(inf).HEALTH - totaldamage
                    shothit = shothit + 1
                    blastnum = 1
                    DO WHILE blastnum < fivecount
                        _PUTIMAGE (xshot(numshots).X, fighters(inf).Y + fighters(inf).RANDOMY), blastgif(blastnum)
                        blastnum = blastnum + 1
                    LOOP
                    xshot(numshots).X = -500 'KEEP
                    xshot(numshots).Y = -500 'KEEP
                    xshot(numshots).ACTIVE = FALSE
                END IF

            END IF

        NEXT

        ' - check for wounded or destroyed ships
        FOR inf = 1 TO numfighters
            RANDOMIZE TIMER
            arbicon = INT(RND * 2) + 1 ' random number between 1 and 2
            IF fighters(inf).HEALTH > 140 AND fighters(inf).HEALTH < 160 AND fighters(inf).SHIELDHEALTH > 0 THEN
                fighters(inf).SHIELDON = 1
                fighters(inf).HEIGHT = 80
                fighters(inf).WIDTH = 100
            END IF

            IF fighters(inf).ACTIVE = fighterwave AND fighters(inf).HEALTH <= 0 AND fighters(inf).KILLED = 0 THEN ' active = 1
                fighters(inf).KILLED = 1
                shotdown = shotdown + 1
                fightersdown = fightersdown + 1
                IF arbicon = 1 THEN
                    fighters(inf).ICONPICKEDUP = 0
                    fighters(inf).RANDOMICON = (INT(RND * 7) + 1)
                END IF
            END IF
        NEXT

        numshots = numshots + 1

    LOOP UNTIL numshots = maxshots

END SUB

SUB bomberhitdetection___PLAYER
    '-------------------------   MULTI SHOT HIT DETECTION   ---------------------
    numshots = 0
    DO
        checkforactiveweapon___PLAYER

        '--------------------------------------------BOMBERS

        FOR i = 1 TO numbombers
            RANDOMIZE TIMER
            bombers(i).RANDOMY = INT(RND * bombers(i).HEIGHT)

            bombers(i).XKILLBOX = bombers(i).X + (bombers(i).WIDTH / 2)
            bombers(i).YKILLBOX = bombers(i).Y + (bombers(i).HEIGHT / 2)

            ' - if player shot hits killbox

            IF (bombers(i).KILLED) = 0 AND (xshot(numshots).X + xshot(numshots).WIDTH >= bombers(i).XKILLBOX) AND (xshot(numshots).X <= bombers(i).XKILLBOX) AND (xshot(numshots).Y <= bombers(i).YKILLBOX) AND (xshot(numshots).Y + xshot(numshots).HEIGHT >= bombers(i).Y) THEN
                bombers(i).HEALTH = bombers(i).HEALTH - extradamage
                shothit = shothit + 1
                blastnum = 1
                DO WHILE blastnum < fivecount
                    _PUTIMAGE (bombers(i).XKILLBOX, bombers(i).YKILLBOX), blastgif(blastnum) ' - place killbox blast on the bomber
                    blastnum = blastnum + 1
                LOOP
                xshot(numshots).X = -500 'KEEP
                xshot(numshots).Y = -500 'KEEP
                xshot(numshots).ACTIVE = FALSE
            END IF

            ' - if player shot hits grazebox

            IF (bombers(i).KILLED) = 0 AND (xshot(numshots).X + xshot(numshots).WIDTH >= bombers(i).X) AND (xshot(numshots).X <= bombers(i).X + bombers(i).WIDTH) AND (xshot(numshots).Y <= bombers(i).YKILLBOX) AND (xshot(numshots).Y + xshot(numshots).HEIGHT >= bombers(i).Y) THEN
                bombers(i).HEALTH = bombers(i).HEALTH - totaldamage
                shothit = shothit + 1
                blastnum = 1
                DO WHILE blastnum < fivecount
                    _PUTIMAGE (xshot(numshots).X, bombers(i).Y + bombers(i).RANDOMY), blastgif(blastnum)
                    blastnum = blastnum + 1
                LOOP
                xshot(numshots).X = -500 'KEEP
                xshot(numshots).Y = -500 'KEEP
                xshot(numshots).ACTIVE = FALSE
            END IF

        NEXT

        ' - check for destroyed ships

        FOR i = 1 TO numbombers
            RANDOMIZE TIMER
            arbicon = INT(RND * 2) + 1 ' random number between 1 and 2
            IF bombers(i).HEALTH <= 0 AND bombers(i).KILLED = 0 THEN
                bombers(i).KILLED = 1
                shotdown = shotdown + 1
                bombersdown = bombersdown + 1
                IF arbicon = 1 THEN
                    bombers(i).ICONPICKEDUP = 0
                    bombers(i).RANDOMICON = (INT(RND * 7) + 1)
                END IF
            END IF
        NEXT

        numshots = numshots + 1
    LOOP UNTIL numshots = maxshots

END SUB

SUB cruiserhitdetection___PLAYER '========================================================= CRUISER HIT DETECTION PLAYER

    '-------------------------   MULTI SHOT HIT DETECTION   ---------------------
    numshots = 0
    DO
        checkforactiveweapon___PLAYER

        '---------------------------------------------CRUISERS

        FOR i = 1 TO numcruisers
            RANDOMIZE TIMER

            cruisers(i).XKILLBOX = cruisers(i).X + (cruisers(i).WIDTH / 2)
            cruisers(i).YKILLBOX = cruisers(i).Y + (cruisers(i).HEIGHT / 2)
            cruisers(i).RANDOMY = INT(RND * cruisers(i).YKILLBOX)

            ' - if player shot hits killbox

            IF (cruisers(i).VISIBLE = 1) AND (cruisers(i).KILLED) = 0 AND (xshot(numshots).X + xshot(numshots).WIDTH >= cruisers(i).XKILLBOX) AND (xshot(numshots).X <= cruisers(i).XKILLBOX) AND (xshot(numshots).Y <= cruisers(i).YKILLBOX) AND (xshot(numshots).Y + xshot(numshots).HEIGHT >= cruisers(i).Y) THEN
                cruisers(i).HEALTH = cruisers(i).HEALTH - extradamage 'xshot(numshots).EXTRADAMAGE
                shothit = shothit + 1
                blastnum = 1
                DO WHILE blastnum < fivecount
                    _PUTIMAGE (INT(RND * cruisers(i).WIDTH) + cruisers(i).X, cruisers(i).Y + cruisers(i).RANDOMY), blastgif(blastnum) ' - place killbox blast on the cruiser
                    blastnum = blastnum + 1
                LOOP
                xshot(numshots).X = -500 'KEEP
                xshot(numshots).Y = -500 'KEEP
                xshot(numshots).ACTIVE = FALSE
            END IF

            ' - if player shot hits grazebox

            IF (cruisers(i).VISIBLE = 1) AND (cruisers(i).KILLED) = 0 AND (xshot(numshots).X + xshot(numshots).WIDTH >= cruisers(i).X) AND (xshot(numshots).X <= cruisers(i).X + cruisers(i).WIDTH) AND (xshot(numshots).Y <= cruisers(i).YKILLBOX) AND (xshot(numshots).Y + xshot(numshots).HEIGHT >= cruisers(i).Y) THEN
                cruisers(i).HEALTH = cruisers(i).HEALTH - totaldamage
                shothit = shothit + 1
                blastnum = 1
                DO WHILE blastnum < fivecount
                    _PUTIMAGE (xshot(numshots).X, cruisers(i).Y + cruisers(i).RANDOMY), blastgif(blastnum)
                    blastnum = blastnum + 1
                LOOP
                xshot(numshots).X = -500 'KEEP TEST
                xshot(numshots).Y = -500 'KEEP
                xshot(numshots).ACTIVE = FALSE
            END IF

        NEXT

        ' - check for destroyed ships

        FOR i = 1 TO numcruisers
            RANDOMIZE TIMER
            arbicon = INT(RND * 2) + 1
            IF cruisers(i).HEALTH <= 0 AND cruisers(i).KILLED = 0 THEN
                cruisers(i).KILLED = 1
                shotdown = shotdown + 1
                cruisersdown = cruisersdown + 1
                IF arbicon = 1 THEN
                    cruisers(i).ICONPICKEDUP = 0
                    cruisers(i).RANDOMICON = (INT(RND * 7) + 1)
                END IF
            END IF
        NEXT

        numshots = numshots + 1
    LOOP UNTIL numshots = maxshots

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB bshiphitdetection___PLAYER

    '-------------------------   MULTI SHOT HIT DETECTION   ---------------------
    numshots = 0
    DO
        checkforactiveweapon___PLAYER

        '---------------------------------------------bships

        FOR i = 1 TO numbships
            RANDOMIZE TIMER

            'bships(i).XKILLBOX = bships(i).X + (bships(i).WIDTH / 2)
            'bships(i).YKILLBOX = bships(i).Y + (bships(i).HEIGHT / 2)
            bships(i).RANDOMY = INT(RND * (bships(i).HEIGHT / 2)) 'YKILLBOX)

            '- if player shot hits killbox

            'IF (bships(i).VISIBLE = 1) AND (bships(i).KILLED) = 0 AND (xshot(numshots).X + xshot(numshots).WIDTH >= bships(i).XKILLBOX) AND (xshot(numshots).X <= bships(i).XKILLBOX) AND (xshot(numshots).Y <= bships(i).YKILLBOX) AND (xshot(numshots).Y + xshot(numshots).HEIGHT >= bships(i).Y) THEN
            '    bships(i).HEALTH = bships(i).HEALTH - extradamage 'xshot(numshots).EXTRADAMAGE
            '    blastnum = 1
            '    DO WHILE blastnum < fivecount
            '        _PUTIMAGE (INT(RND * bships(i).WIDTH) + bships(i).X, bships(i).Y + bships(i).RANDOMY), blastgif(blastnum) ' - place killbox blast on the cruiser
            '        blastnum = blastnum + 1
            '    LOOP
            '    xshot(numshots).X = -500 'KEEP
            '    xshot(numshots).Y = -500 'KEEP
            '    xshot(numshots).ACTIVE = FALSE
            'END IF

            ' - if player shot hits grazebox

            IF bships(i).KILLED = 0 AND (xshot(numshots).X + xshot(numshots).WIDTH >= bships(i).X) AND (xshot(numshots).X <= bships(i).X + bships(i).WIDTH) AND (xshot(numshots).Y <= (bships(i).HEIGHT / 2)) AND (xshot(numshots).Y + xshot(numshots).HEIGHT >= bships(i).Y) THEN
                bships(i).HEALTH = bships(i).HEALTH - totaldamage
                shothit = shothit + 1
                blastnum = 1
                DO WHILE blastnum < fivecount
                    _PUTIMAGE (xshot(numshots).X, bships(i).Y + bships(i).RANDOMY), blastgif(blastnum)
                    blastnum = blastnum + 1
                LOOP
                xshot(numshots).X = -500 'KEEP TEST
                xshot(numshots).Y = -500 'KEEP
                xshot(numshots).ACTIVE = FALSE
            END IF

        NEXT

        ' - check for destroyed ships

        FOR i = 1 TO numbships
            'RANDOMIZE TIMER
            'arbicon = INT(RND * 2)
            IF bships(i).HEALTH <= 0 AND bships(i).KILLED = 0 THEN
                bships(i).KILLED = 1
                shotdown = shotdown + 1
                bshipsdown = bshipsdown + 1
                'IF arbicon = 1 THEN
                '    bships(i).ICONPICKEDUP = 0
                '    bships(i).RANDOMICON = (INT(RND * 7) + 1)
                'END IF
            END IF
        NEXT

        numshots = numshots + 1
    LOOP UNTIL numshots = maxshots

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB checkforactiveweapon___PLAYER '=====================================================================SUB CHECK FOR WEAPON TYPE
    RANDOMIZE TIMER

    IF xshot(numshots).ACTIVE AND weapontype = 1 THEN ' rapid laser

        xshot(numshots).SPEED = 10
        xshot(numshots).HEIGHT = baseheight + upgradeheight '20
        xshot(numshots).WIDTH = basewidth + upgradewidth '10
        xshot(numshots).MIDX = xshot(numshots).WIDTH / 2
        xshot(numshots).Y = xshot(numshots).Y - xshot(numshots).SPEED '-5
        totaldamage = basedamage + upgradedamage
        extradamage = basedamage * 2
        IF xshot(numshots).Y <= 0 THEN
            xshot(numshots).ACTIVE = FALSE
            xshot(numshots).X = -500 'KEEP
            xshot(numshots).Y = -500 'KEEP
        ELSE
            _PUTIMAGE (xshot(numshots).X, xshot(numshots).Y), drawrapid(shotnum)
        END IF
    END IF

    IF xshot(numshots).ACTIVE AND weapontype = 2 THEN 'single laser
        xshot(numshots).SPEED = 5 '10
        xshot(numshots).HEIGHT = baseheight + upgradeheight '20
        xshot(numshots).WIDTH = basewidth + upgradewidth '10
        xshot(numshots).MIDX = xshot(numshots).WIDTH / 2
        xshot(numshots).Y = xshot(numshots).Y - xshot(numshots).SPEED '-5
        totaldamage = basedamage + upgradedamage
        extradamage = basedamage * 2
        IF xshot(numshots).Y <= 0 THEN
            xshot(numshots).ACTIVE = FALSE
            xshot(numshots).X = -500 'KEEP
            xshot(numshots).Y = -500 'KEEP
        ELSE
            _PUTIMAGE (xshot(numshots).X, xshot(numshots).Y), drawsingle(shotnum)
        END IF
    END IF

    IF xshot(numshots).ACTIVE AND weapontype = 3 THEN ' scrap cannon
        xshot(numshots).SPEED = 10
        xshot(numshots).HEIGHT = 30
        xshot(numshots).WIDTH = 30
        xshot(numshots).MIDX = xshot(numshots).WIDTH / 2
        xshot(numshots).Y = xshot(numshots).Y - xshot(numshots).SPEED '-5
        totaldamage = basedamage + upgradedamage
        extradamage = basedamage * 2
        IF xshot(numshots).Y <= 0 THEN
            xshot(numshots).ACTIVE = FALSE
            xshot(numshots).X = -500 'KEEP
            xshot(numshots).Y = -500 'KEEP
        ELSE
            _PUTIMAGE (xshot(numshots).X, xshot(numshots).Y), drawscannon(shotnum)
        END IF
    END IF

END SUB

'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB fireweapon___PLAYER '====================================================================SUB SINGLE LASER PLAYER

    IF _KEYDOWN(32) AND playerkeydelay = 0 THEN
        RANDOMIZE TIMER
        IF issoundon = 1 AND TIMER + soundlength > soundtimer THEN 'slow sounding. has pauses between bursts
            soundtimer = TIMER + soundlength
            IF decreasekeydelay = 0 THEN playerkeydelay = 16 ' sets default keydelay
            IF decreasekeydelay >= 10 THEN decreasekeydelay = 10 'TEST

            SELECT CASE weapontype
                CASE 1 ' rapid laser
                    _SNDVOL multilasersound, soundlevel
                    _SNDPLAYCOPY multilasersound

                CASE 2 ' single laser
                    _SNDVOL singlelasersound, soundlevel
                    _SNDPLAYCOPY singlelasersound

                CASE 3 ' scrap cannon
                    _SNDVOL scrapcannonsound, soundlevel
                    _SNDPLAYCOPY scrapcannonsound

            END SELECT
        END IF
        shotfired = shotfired + 1
        numshots = 0
        DO
            IF NOT xshot(numshots).ACTIVE THEN ' if no shots are active???
                xshot(numshots).ACTIVE = TRUE
                xshot(numshots).X = (player.X + (player.WIDTH / 2)) - xshot(numshots).MIDX
                xshot(numshots).Y = player.Y
                EXIT DO
            END IF
            numshots = numshots + 1

        LOOP UNTIL numshots = maxshots
        playerkeydelay = 16 - decreasekeydelay
    END IF
    IF playerkeydelay THEN playerkeydelay = playerkeydelay - 1

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB scraphitdetect___PLAYER '=================================================================SUB SCRAP HIT DETECT PLAYER

    FOR i = 1 TO numscrap
        IF (player.X + player.WIDTH >= scrap(i).X) AND (player.X <= scrap(i).X + scrap(i).WIDTH) AND (player.Y <= scrap(i).Y + scrap(i).HEIGHT) AND (player.Y + player.HEIGHT >= scrap(i).Y) THEN
            IF issoundon = 1 THEN
                _SNDVOL scrapcollectedsound, soundlevel
                IF scrapcollectedsound THEN _SNDPLAYCOPY scrapcollectedsound
            END IF
            scrap(i).COLLECTED = 1
            scrap(i).WIDTH = 0
            scrap(i).HEIGHT = 0
            scrap(i).X = -2000 '  - make sure x and y are completely off screen so scrap not triggered.
            scrap(i).Y = -2000
            scrapcollected = scrapcollected + 1
        END IF

    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB collisioncheck___PLAYER '======================================================= SUB COLLISION CHECK PLAYER

    '--------------------------FIGHTERS

    FOR inf = 1 TO numfighters
        ' - player killbox collides with intact fighter
        IF fighters(inf).KILLED = 0 AND (player.XKILLBOX >= fighters(inf).X) AND (player.XKILLBOX <= fighters(inf).X + fighters(inf).WIDTH) AND (player.YKILLBOX <= fighters(inf).Y + fighters(inf).HEIGHT) AND (player.YKILLBOX >= fighters(inf).Y) THEN
            player.KILLED = 1
        END IF

        '   - player collides with destroyed fighter
        IF fightersicon(inf).KILLED = 1 AND fightersicon(inf).ICONPICKEDUP = 0 AND (player.X + player.WIDTH >= fightersicon(inf).XKILLBOX) AND (player.X <= fightersicon(inf).XKILLBOX + fightersicon(inf).WIDTH) AND (player.Y <= fightersicon(inf).YKILLBOX + fightersicon(inf).HEIGHT) AND (player.Y + player.HEIGHT >= fightersicon(inf).YKILLBOX) THEN
            IF issoundon = 1 THEN
                _SNDVOL scrapcollectedsound, soundlevel
                IF scrapcollectedsound THEN _SNDPLAYCOPY scrapcollectedsound
                '_SNDVOL thatllhelpaudio, audiolevel
                '_SNDPLAYCOPY thatllhelpaudio

            END IF

            SELECT CASE fightersicon(inf).RANDOMICON
                CASE 1 ' speed upgrade
                    decreasekeydelay = decreasekeydelay + 1
                CASE 2 ' width upgrade
                    IF weapontype = 1 THEN
                        upgradewidth = upgradewidth + 10
                        upgradeheight = upgradeheight + 20
                    END IF
                    IF weapontype = 2 OR weapontype = 3 THEN
                        upgradewidth = upgradewidth + 10
                        upgradeheight = upgradeheight + 10
                    END IF
                    shotnum = shotnum + 1
                CASE 3 ' damage upgrade
                    upgradedamage = basedamage + 20
                CASE 4 ' scrap storm
                    scrapstormscript = 1
                    scrapstormcollected = scrapcollected
                CASE 5 ' rapid laser
                    weapontype = 1
                    basewidth = 10
                    baseheight = 20
                    basedamage = 40
                CASE 6 ' single laser
                    weapontype = 2
                    basewidth = 20
                    baseheight = 30
                    basedamage = 60
                CASE 7 ' scrap cannon
                    weapontype = 3
                    basewidth = 20
                    baseheight = 20
                    basedamage = 80
            END SELECT
            fightersicon(inf).ICONPICKEDUP = 1

        END IF

    NEXT

    ' - see if enemy fighters steal powerups
    FOR inf = 1 TO numfighters
        FOR i = 1 TO numfighters

            IF fightersicon(i).KILLED = 1 AND fightersicon(i).ICONPICKEDUP = 0 AND (fighters(inf).X + fighters(inf).WIDTH >= fightersicon(i).XKILLBOX) AND (fighters(inf).X <= fightersicon(i).XKILLBOX + fightersicon(i).WIDTH) AND (fighters(inf).Y <= fightersicon(i).YKILLBOX + fightersicon(i).HEIGHT) AND (fighters(inf).Y + fighters(inf).HEIGHT >= fightersicon(i).YKILLBOX) THEN

                SELECT CASE fighters(i).RANDOMICON
                    CASE 1 ' speed upgrade
                        eupgradespeed = eupgradespeed + 1
                    CASE 2 ' width upgrade
                        eupgradewidth = eupgradewith + 5
                        eupgradeheight = eupgradeheight + 10
                        eshotnum = eshotnum + 1
                    CASE 3 ' damage upgrade
                        eupgradedamage = eupgradedamage + 10
                    CASE 4 ' laserstorm
                        laserstormscript = 1
                    CASE 5 TO 7
                END SELECT

                IF fighters(i).RANDOMICON < 5 THEN
                    fighters(inf).ICONPICKEDUP = 1
                    fightersicon(i).ICONPICKEDUP = 1 'WORKED!!!!!
                END IF
            END IF
        NEXT
    NEXT

    '--------------------------BOMBERS
    FOR i = 1 TO numbombers
        ' - player killbox collides with intact bomber
        IF bombers(i).KILLED = 0 AND (player.XKILLBOX >= bombers(i).X) AND (player.XKILLBOX <= bombers(i).X + bombers(i).WIDTH) AND (player.YKILLBOX <= bombers(i).Y + bombers(i).HEIGHT) AND (player.YKILLBOX >= bombers(i).Y) THEN
            player.KILLED = 1
        END IF

        '   - player collides with destroyed bomber
        IF bombers(i).KILLED = 1 AND bombers(i).ICONPICKEDUP = 0 AND (player.X + player.WIDTH >= bombers(i).XKILLBOX) AND (player.X <= bombers(i).XKILLBOX + bombers(i).WIDTH) AND (player.Y <= bombers(i).YKILLBOX + bombers(i).HEIGHT) AND (player.Y + player.HEIGHT >= bombers(i).YKILLBOX) THEN
            IF issoundon = 1 THEN
                _SNDVOL scrapcollectedsound, soundlevel
                IF scrapcollectedsound THEN _SNDPLAYCOPY scrapcollectedsound
            END IF

            SELECT CASE bombers(i).RANDOMICON
                CASE 1 ' speed upgrade
                    decreasekeydelay = decreasekeydelay + 1
                CASE 2 ' width upgrade
                    IF weapontype = 1 THEN
                        upgradewidth = upgradewidth + 10
                        upgradeheight = upgradeheight + 20
                    END IF
                    IF weapontype = 2 OR weapontype = 3 THEN
                        upgradewidth = upgradewidth + 10
                        upgradeheight = upgradeheight + 10
                    END IF
                    shotnum = shotnum + 1
                CASE 3 ' damage upgrade
                    upgradedamage = basedamage + 20
                CASE 4 ' scrap storm
                    scrapstormscript = 1
                    scrapstormcollected = scrapcollected
                CASE 5 ' rapid laser
                    weapontype = 1
                    basewidth = 10
                    baseheight = 20
                    basedamage = 30
                CASE 6 ' single laser
                    weapontype = 2
                    basewidth = 20
                    baseheight = 30
                    basedamage = 50
                CASE 7 ' scrap cannon
                    weapontype = 3
                    basewidth = 20
                    baseheight = 20
                    basedamage = 100
            END SELECT
            shotnum = shotnum + 1
            bombers(i).ICONPICKEDUP = 1

        END IF

    NEXT

    '------------------------CRUISERS
    FOR i = 1 TO numcruisers
        '   - player collides with intact cruiser
        IF cruisers(i).KILLED = 0 AND (player.XKILLBOX >= cruisers(i).X) AND (player.XKILLBOX <= cruisers(i).X + cruisers(i).WIDTH) AND (player.YKILLBOX <= cruisers(i).Y + cruisers(i).HEIGHT) AND (player.YKILLBOX >= cruisers(i).Y) THEN ' TEST added cruisers(i).killed
            player.KILLED = 1
        END IF

        '   - player collides with destroyed cruiser
        IF cruisers(i).KILLED = 1 AND cruisers(i).ICONPICKEDUP = 0 AND (player.X + player.WIDTH >= cruisers(i).XKILLBOX) AND (player.X <= cruisers(i).XKILLBOX + cruisers(i).WIDTH) AND (player.Y <= cruisers(i).YKILLBOX + cruisers(i).HEIGHT) AND (player.Y + player.HEIGHT >= cruisers(i).YKILLBOX) THEN ' TEST added cruisers(i).killed
            IF issoundon = 1 THEN
                _SNDVOL scrapcollectedsound, soundlevel
                IF scrapcollectedsound THEN _SNDPLAYCOPY scrapcollectedsound
            END IF

            SELECT CASE cruisers(i).RANDOMICON
                CASE 1 ' speed upgrade
                    decreasekeydelay = decreasekeydelay + 1
                CASE 2 ' width upgrade
                    IF weapontype = 1 THEN
                        upgradewidth = upgradewidth + 10
                        upgradeheight = upgradeheight + 20
                    END IF
                    IF weapontype = 2 OR weapontype = 3 THEN
                        upgradewidth = upgradewidth + 10
                        upgradeheight = upgradeheight + 10
                    END IF
                    shotnum = shotnum + 1
                CASE 3 ' damage upgrade
                    upgradedamage = basedamage + 20
                CASE 4 ' scrap storm
                    scrapstormscript = 1
                    scrapstormcollected = scrapcollected
                CASE 5 ' rapid laser
                    weapontype = 1
                    basewidth = 10
                    baseheight = 20
                    basedamage = 30
                CASE 6 ' single laser
                    weapontype = 2
                    basewidth = 20
                    baseheight = 30
                    basedamage = 50
                CASE 7 ' scrap cannon
                    weapontype = 3
                    basewidth = 20
                    baseheight = 20
                    basedamage = 100
            END SELECT
            shotnum = shotnum + 1
            cruisers(i).ICONPICKEDUP = 1

        END IF

    NEXT

    '-------------------------BATTLESHIPS
    FOR i = 1 TO numbships

        IF bships(i).KILLED = 0 AND (player.XKILLBOX >= bships(i).X) AND (player.XKILLBOX <= bships(i).X + bships(i).WIDTH) AND (player.YKILLBOX <= bships(i).Y + bships(i).HEIGHT) AND (player.YKILLBOX >= bships(i).Y) THEN
            player.KILLED = 1
        END IF

    NEXT

    IF shotnum >= fourcount THEN shotnum = 4
    IF eshotnum >= fourcount THEN eshotnum = 4

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

'                                               !!!  ENEMY subroutines !!!

'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB resetbships___ENEMY '================================================================ SUB RESET BSHIPS ENEMY

    numbshots = 0
    RANDOMIZE TIMER
    rx = INT(RND * 3) + 203 'necessary???
    ry = INT(RND * 3) + 129 'necessary???
    'FOR guns = 1 TO maxguns ' 1 to 4
    DO
        FOR i = 1 TO numbships
            IF NOT batshot(numbshots).ACTIVE THEN ' if no shots are active???
                batshot(numbshots).ACTIVE = TRUE
                'FOR guns = 1 TO maxguns
                'SELECT CASE guns
                'CASE 1
                'batshot(numbshots).X = (bships(i).X + 94) - batshot(numbshots).MIDX
                'batshot(numbshots).Y = (bships(i).Y + 135)
                'CASE 2
                batshot(numbshots).X = (bships(i).X + rx) - batshot(numbshots).MIDX '205) - batshot(numbshots).MIDX
                batshot(numbshots).Y = (bships(i).Y + ry) '131)
                'CASE 3
                'batshot(numbshots).X = (bships(i).X + 353) - batshot(numbshots).MIDX
                'batshot(numbshots).Y = (bships(i).Y + 134)
                'CASE 4
                'batshot(numbshots).X = (bships(i).X + 412) - batshot(numbshots).MIDX
                'batshot(numbshots).Y = (bships(i).Y + 121)
                'END SELECT
                'NEXT
                EXIT DO
            END IF
            numbshots = numbshots + 1
        NEXT
    LOOP UNTIL numbshots = maxshots
    IF numbshots = maxshots THEN numbshots = 0

    'NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB resetbombers___ENEMY '========================================================SUB RESET BOMBERS ENEMY

    FOR i = 1 TO numbombers

        IF bombers(i).ACTIVE = bomberwave AND bombers(i).KILLED = 0 AND bshot(i).RANGE = 0 THEN
            RANDOMIZE TIMER
            bshot(i).HEIGHT = 40
            bshot(i).WIDTH = 40
            bshot(i).X = bombers(i).XKILLBOX - (bshot(i).WIDTH / 2) 'shot origin
            bshot(i).Y = bombers(i).Y + bombers(i).HEIGHT 'bombers(i).YKILLBOX - bshot(i).MIDY 'shot origin
            bshot(i).DAMAGE = 50
        END IF
    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB resetcruisers___ENEMY '====================================================SUB RESET CRUISERS ENEMY

    FOR i = 1 TO numcruisers

        IF cruisers(i).FIRING = 0 AND cruisers(i).KILLED = 0 THEN 'cruisers(i).FIRING = 0 AND cruisers(i).KILLED = 0 THEN 'ESSENTIAL
            RANDOMIZE TIMER
            cshot(i).SPEED = INT(RND * 2) + cruisers(i).CRUISERSPEED + 2
            cshot(i).HEIGHT = 30
            cshot(i).WIDTH = 30
            cshot(i).X = cruisers(i).XKILLBOX - (cshot(i).WIDTH / 2) 'shot origin
            cshot(i).Y = cruisers(i).YKILLBOX - (cshot(i).HEIGHT / 2) 'shot origin
            cshot(i).DAMAGE = 35
            cruisers(i).DISTANCEX = 0
            cruisers(i).DISTANCEY = 0
            cruisers(i).ODDSOFACTIVE = 0
            cruisers(i).PLAYERPOSITION = 3
            cruisers(i).PLAYERABOVE = 3
        END IF
    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB resetfighters___ENEMY '===============================================SUB RESET FIGHTERS ENEMY

    FOR inf = 1 TO numfighters
        RANDOMIZE TIMER

        IF fighters(inf).FIRING = 0 AND fighters(inf).ACTIVE = fighterwave THEN
            fshot(inf).SPEED = INT(RND * 2) + fighters(inf).FIGHTERSPEED + 2 + eupgradespeed
            fshot(inf).WIDTH = 10 + eupgradewidth
            fshot(inf).HEIGHT = 20 + eupgradeheight
            fshot(inf).X = fighters(inf).XKILLBOX - (fshot(inf).WIDTH / 2)
            fshot(inf).Y = fighters(inf).Y + fighters(inf).HEIGHT
            fshot(inf).DAMAGE = 20 + eupgradedamage
        END IF

    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB bombershots___ENEMY

    FOR i = 1 TO numbombers

        IF bombers(i).ACTIVE = bomberwave AND bombers(i).KILLED = 0 THEN ' added and bombers(i).killed = 0 because bombers were firing after being shot down
            RANDOMIZE TIMER

            IF bombers(i).XKILLBOX <= player.XKILLBOX AND bshot(i).RANGE < 500 THEN ' - if bomber left of player and shots not fired or still firing

                IF bshot(i).Y + (bshot(i).HEIGHT / 2) < player.YKILLBOX THEN bshot(i).Y = bshot(i).Y + 1
                IF bshot(i).Y + (bshot(i).HEIGHT / 2) > player.YKILLBOX THEN bshot(i).Y = bshot(i).Y - 1
                IF bshot(i).X + (bshot(i).WIDTH / 2) < player.XKILLBOX THEN bshot(i).X = bshot(i).X + 1
                IF bshot(i).X + (bshot(i).WIDTH / 2) > player.XKILLBOX THEN bshot(i).X = bshot(i).X - 1

                bshot(i).RANGE = bshot(i).RANGE + 1

            END IF

            IF bshot(i).RANGE >= 500 THEN
                bshot(i).RANGE = 0
                bombers(i).X = (win.RIGHT + (bombers(i).WIDTH * i)) ' + bombers(i).WIDTH)
                bombers(i).Y = INT(RND * 300) * -1
            END IF

            ' - shot hits killbox. 50 damage
            IF (player.XKILLBOX >= bshot(i).X) AND (player.XKILLBOX <= bshot(i).X + bshot(i).WIDTH) AND (player.YKILLBOX <= bshot(i).Y + bshot(i).HEIGHT) AND (player.YKILLBOX >= bshot(i).Y) THEN

                player.HEALTH = player.HEALTH - bshot(i).DAMAGE
                playerhitanimation___PLAYER
                bshot(i).RANGE = 0
                bombers(i).X = (win.RIGHT + (bombers(i).WIDTH * i))
                bombers(i).Y = INT(RND * 300) * -1
            END IF

            ' - shot hits grey zone. 30-40 damage
            IF (player.X + player.WIDTH >= bshot(i).X) AND (player.X <= bshot(i).X + bshot(i).WIDTH) AND (player.Y <= bshot(i).Y + bshot(i).HEIGHT) AND (player.Y + player.HEIGHT >= bshot(i).Y) THEN
                player.HEALTH = player.HEALTH - (INT(RND * 10) + 30)
                playerhitanimation___PLAYER
                bshot(i).RANGE = 0
                bombers(i).X = (win.RIGHT + (bombers(i).WIDTH * i))
                bombers(i).Y = INT(RND * 300) * -1
            END IF

            IF bshot(i).RANGE <= 500 AND bshot(i).RANGE >= 1 THEN ' AND bombers(i).KILLED = 0 THEN

                IF bombers(i).COUNTINGDOWN = 0 THEN
                    SELECT CASE bombers(i).ARBPIC
                        CASE IS < 3
                            _PUTIMAGE (bshot(i).X, bshot(i).Y), bombershotpic1 ' - if you comment this out, shots will stay centered on the bombers.
                        CASE 3 TO 5
                            _PUTIMAGE (bshot(i).X, bshot(i).Y), bombershotpic2
                        CASE IS > 5
                            _PUTIMAGE (bshot(i).X, bshot(i).Y), bombershotpic3
                            IF bombers(i).ARBPIC = 9 THEN bombers(i).COUNTINGDOWN = 1
                    END SELECT
                    bombers(i).ARBPIC = bombers(i).ARBPIC + 1
                END IF

                IF bombers(i).COUNTINGDOWN = 1 THEN
                    bombers(i).ARBPIC = bombers(i).ARBPIC - 1
                    SELECT CASE bombers(i).ARBPIC
                        CASE 6 TO 8
                            _PUTIMAGE (bshot(i).X, bshot(i).Y), bombershotpic2
                        CASE IS < 6
                            _PUTIMAGE (bshot(i).X, bshot(i).Y), bombershotpic1
                            IF bombers(i).ARBPIC = 3 THEN bombers(i).COUNTINGDOWN = 0
                    END SELECT
                END IF

            END IF
        END IF

    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB cruisershots___ENEMY '=======================================================SUB CRUISER SHOTS ENEMY

    FOR i = 1 TO numcruisers

        IF cruisers(i).FIRING = 0 AND cruisers(i).VISIBLE = 1 THEN ' - if cruisers not active but visible
            RANDOMIZE TIMER

            cruisers(i).DISTANCEX = cruisers(i).XKILLBOX - player.XKILLBOX ' - calculate distance to player on x

            IF cruisers(i).DISTANCEX < 0 THEN cruisers(i).DISTANCEX = cruisers(i).DISTANCEX * -1 ' - make x distance positive

            cruisers(i).DISTANCEY = cruisers(i).YKILLBOX - player.YKILLBOX '  - calculate distance to player on y

            IF cruisers(i).DISTANCEY < 0 THEN cruisers(i).DISTANCEY = cruisers(i).DISTANCEY * -1 ' - make y distance positive

            IF cruisers(i).YKILLBOX < player.YKILLBOX THEN cruisers(i).PLAYERABOVE = 1 ' - if middle of cruiser is above player

            IF cruisers(i).YKILLBOX >= player.YKILLBOX THEN cruisers(i).PLAYERABOVE = 0 ' - if middle of cruiser is below player

            cruisers(i).ODDSOFACTIVE = INT(RND * cruisers(i).DISTANCEX) + 1 ' - pick random number based on x distance WHAT ABOUT Y?

            IF cruisers(i).XKILLBOX < player.XKILLBOX THEN 'if player is idle right of cruiser  'TEST
                IF cruisers(i).ODDSOFACTIVE < 20 THEN
                    cruisers(i).FIRING = 1
                    cruisers(i).PLAYERPOSITION = 1
                END IF
            END IF

            IF cruisers(i).XKILLBOX >= player.XKILLBOX THEN 'if player is idle left of cruiser  'TEST
                IF cruisers(i).ODDSOFACTIVE < 20 THEN
                    cruisers(i).FIRING = 1
                    cruisers(i).PLAYERPOSITION = 2
                END IF
            END IF

            IF cruisers(i).DISTANCEX >= 100 THEN
                cruisers(i).DISTANCEX = cruisers(i).DISTANCEX / 100
            ELSE
                cruisers(i).DISTANCEX = cruisers(i).DISTANCEX / 10
            END IF

            IF cruisers(i).DISTANCEY >= 100 THEN
                cruisers(i).DISTANCEY = cruisers(i).DISTANCEY / 100
            ELSE
                cruisers(i).DISTANCEY = cruisers(i).DISTANCEY / 10
            END IF

            cruisers(i).DISTANCEY = _ROUND(cruisers(i).DISTANCEY)
            cruisers(i).DISTANCEX = _ROUND(cruisers(i).DISTANCEX)

        END IF
    NEXT

    '----------------------------CRUISERS

    FOR i = 1 TO numcruisers

        IF cruisers(i).FIRING = 1 AND cruisers(i).VISIBLE THEN 'active = 1
            RANDOMIZE TIMER

            IF cruisers(i).PLAYERABOVE = 0 THEN cshot(i).Y = (cshot(i).Y - cruisers(i).DISTANCEY) ' TEST if player is above cruiser????

            IF cruisers(i).PLAYERABOVE = 1 THEN cshot(i).Y = (cshot(i).Y + cruisers(i).DISTANCEY)

            IF cruisers(i).PLAYERPOSITION = 1 THEN cshot(i).X = (cshot(i).X + cruisers(i).DISTANCEX)

            IF cruisers(i).PLAYERPOSITION = 2 THEN cshot(i).X = (cshot(i).X - cruisers(i).DISTANCEX)

            IF cshot(i).X < win.LEFT OR cshot(i).X > win.RIGHT OR cshot(i).Y < win.TOP OR cshot(i).Y > win.BOTTOM THEN
                cruisers(i).FIRING = 0
                cshot(i).X = -500
                cshot(i).Y = -500
            END IF

            ' - shot hits killbox. 35 damage
            IF (player.XKILLBOX >= cshot(i).X) AND (player.XKILLBOX <= cshot(i).X + cshot(i).WIDTH) AND (player.YKILLBOX <= cshot(i).Y + cshot(i).HEIGHT) AND (player.YKILLBOX >= cshot(i).Y) THEN

                player.HEALTH = player.HEALTH - cshot(i).DAMAGE
                playerhitanimation___PLAYER
                cruisers(i).FIRING = 0
                cshot(i).X = -500
                cshot(i).Y = -500
            END IF

            ' - shot hits grey zone. 15-20 damage
            IF (player.X + player.WIDTH >= cshot(i).X) AND (player.X <= cshot(i).X + cshot(i).WIDTH) AND (player.Y <= cshot(i).Y + cshot(i).HEIGHT) AND (player.Y + player.HEIGHT >= cshot(i).Y) THEN
                player.HEALTH = player.HEALTH - (INT(RND * 5) + 15)
                playerhitanimation___PLAYER
                cruisers(i).FIRING = 0
                cshot(i).X = -500
                cshot(i).Y = -500
            END IF

            IF cruisers(i).FIRING = 1 THEN _PUTIMAGE (cshot(i).X, cshot(i).Y), cruisershotpic ' - if you comment this out, shots will stay centered on the cruisers.

        END IF

    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB fightershots___ENEMY '======================================================= SUB FIGHTER SHOTS ENEMY

    '--------------------------------------------FIGHTERS
    FOR inf = 1 TO numfighters

        IF fighters(inf).FIRING = 0 AND fighters(inf).ACTIVE = fighterwave THEN

            IF (fighters(inf).KILLED = 0) AND (fighters(inf).XKILLBOX <= player.X + player.WIDTH) AND (fighters(inf).XKILLBOX >= player.X) AND (fighters(inf).Y + fighters(inf).HEIGHT < player.Y) THEN
                fighters(inf).FIRING = 1
            END IF

        END IF

    NEXT

    '---------------------------------FIGHTERS

    FOR inf = 1 TO numfighters
        RANDOMIZE TIMER

        IF fighters(inf).FIRING = 1 AND fighters(inf).ACTIVE = fighterwave THEN 'if fighter is firing and part of active fighter wave.

            fshot(inf).Y = fshot(inf).Y + fshot(inf).SPEED '             - calculate shot speed

            ' - shot hits killbox. 20 damage
            IF (player.XKILLBOX >= fshot(inf).X) AND (player.XKILLBOX <= fshot(inf).X + fshot(inf).WIDTH) AND (player.YKILLBOX <= fshot(inf).Y + fshot(inf).HEIGHT) AND (player.YKILLBOX >= fshot(inf).Y) THEN

                player.HEALTH = player.HEALTH - fshot(inf).DAMAGE '  - calculate new player health
                playerhitanimation___PLAYER
                fshot(inf).X = -500
                fshot(inf).Y = -500
                fighters(inf).FIRING = 0 '                           - deactivate shot
            END IF

            ' - shot hits grey zone. 10-15 damage
            IF (player.X >= fshot(inf).X) AND (player.X <= fshot(inf).X + fshot(inf).WIDTH) AND (player.Y <= fshot(inf).Y + fshot(inf).HEIGHT) AND (player.Y + player.HEIGHT >= fshot(inf).Y) THEN
                player.HEALTH = player.HEALTH - (INT(RND * 5) + 10) '  - calculate new player health
                playerhitanimation___PLAYER
                fshot(inf).X = -500
                fshot(inf).Y = -500
                fighters(inf).FIRING = 0 '                           - deactivate shot
            END IF

            IF fshot(inf).Y > win.BOTTOM THEN
                fshot(inf).X = -500
                fshot(inf).Y = -500
                fighters(inf).FIRING = 0
            END IF

            IF fighters(inf).FIRING = 1 THEN _PUTIMAGE (fshot(inf).X, fshot(inf).Y), draweshot(eshotnum)

            'IF fighters(inf).FIRING = 1 AND fighterlaserupgrade = 1 THEN _PUTIMAGE (fshot(inf).X, fshot(inf).Y), fightershotpic ' - if shot is active draw shot pic
            'IF fighters(inf).FIRING = 1 AND fighterlaserupgrade = 2 THEN _PUTIMAGE (fshot(inf).X, fshot(inf).Y), fightershotpic2

        END IF

    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB bshipshots___ENEMY '================================================================ SUB BATTLESHIP SHOTS ENEMY

    RANDOMIZE TIMER
    spread = (INT(RND * 6) + 5) * -1

    DO
        IF batshot(numbshots).ACTIVE THEN ' rapid laser
            batshot(numbshots).SPEED = 10
            batshot(numbshots).HEIGHT = 20
            batshot(numbshots).WIDTH = 10
            batshot(numbshots).MIDX = batshot(numbshots).WIDTH / 2
            batshot(numbshots).X = batshot(numbshots).X + (spread / 2) 'battleship shots forward
            batshot(numbshots).Y = batshot(numbshots).Y + 5 'battleship shoots down
            batshot(numbshots).DAMAGE = 10 ' 200 for testing only
            IF batshot(numbshots).Y >= 1000 THEN
                batshot(numbshots).ACTIVE = FALSE
                batshot(numbshots).X = -500 'KEEP
                batshot(numbshots).Y = -500 'KEEP
            ELSE
                _PUTIMAGE (batshot(numbshots).X, batshot(numbshots).Y), cruisershotpic
            END IF

        END IF

        numbshots = numbshots + 1
        spread = spread + 1
    LOOP UNTIL numbshots = maxshots
    numbshots = 1

    ' check for hits against player
    FOR numbshots = 1 TO maxshots

        ' - shot hits killbox. 20 damage
        'IF (player.XKILLBOX >= batshot(numbshots).X) AND (player.XKILLBOX <= batshot(numbshots).X + batshot(numbshots).WIDTH) AND (player.YKILLBOX <= batshot(numbshots).Y + batshot(numbshots).HEIGHT) AND (player.YKILLBOX >= batshot(numbshots).Y) THEN
        '    player.HEALTH = player.HEALTH - batshot(numbshots).DAMAGE '  - calculate new player health
        '    playerhitanimation___PLAYER
        '    batshot(numbshots).X = -500
        '    batshot(numbshots).Y = -500
        '    batshot(numbshots).ACTIVE = FALSE
        'END IF

        ' - shot hits grey zone. 20 damage
        IF (player.X >= batshot(numbshots).X) AND (player.X <= batshot(numbshots).X + batshot(numbshots).WIDTH) AND (player.Y <= batshot(numbshots).Y + batshot(numbshots).HEIGHT) AND (player.Y + player.HEIGHT >= batshot(numbshots).Y) THEN
            player.HEALTH = player.HEALTH - batshot(numbshots).DAMAGE '  - calculate new player health
            playerhitanimation___PLAYER
            batshot(numbshots).X = -500
            batshot(numbshots).Y = -500
            batshot(numbshots).ACTIVE = FALSE
        END IF

    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB movebattleships___ENEMY '==============================================================SUB MOVE CARRIERS ENEMY
    FOR i = 1 TO numbships
        bships(i).X = bships(i).X + 1
        IF bships(i).X >= bships(i).STOPPINGX THEN bships(i).X = 300

        SELECT CASE bships(i).HEALTH
            CASE 3000
                _PUTIMAGE (bships(i).X, bships(i).Y), bshipunit
            CASE 2000 TO 2999
                _PUTIMAGE (bships(i).X, bships(i).Y), bshipdmg1
            CASE 1000 TO 1999
                _PUTIMAGE (bships(i).X, bships(i).Y), bshipdmg2
            CASE 1 TO 999
                _PUTIMAGE (bships(i).X, bships(i).Y), bshipdmg3
        END SELECT

    NEXT
END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB movebombers___ENEMY '=================================================================SUB MOVE BOMBERS ENEMY

    FOR i = 1 TO numbombers
        RANDOMIZE TIMER

        IF bombers(i).ACTIVE = bomberwave AND bombers(i).KILLED = 0 THEN
            bombers(i).Y = bombers(i).Y + 1
            bombers(i).X = bombers(i).X - bombers(i).BOMBERSPEED

            SELECT CASE bombers(i).HEALTH
                CASE 600
                    _PUTIMAGE (bombers(i).X, bombers(i).Y), bomberunit
                CASE 400 TO 599
                    _PUTIMAGE (bombers(i).X, bombers(i).Y), bomberdmg1
                    bombers(i).WIDTH = 117
                    bombers(i).HEIGHT = 92
                CASE 200 TO 399
                    bombers(i).WIDTH = 116
                    bombers(i).HEIGHT = 87
                    _PUTIMAGE (bombers(i).X, bombers(i).Y), bomberdmg2
                CASE 1 TO 199
                    bombers(i).WIDTH = 115
                    bombers(i).HEIGHT = 87
                    _PUTIMAGE (bombers(i).X, bombers(i).Y), bomberdmg3
            END SELECT

        END IF

        IF bombers(i).KILLED = 1 AND bombers(i).ICONPICKEDUP = 0 THEN
            bombers(i).HEIGHT = 50
            bombers(i).WIDTH = 50

            SELECT CASE bombers(i).RANDOMICON

                CASE 1
                    _PUTIMAGE (bombers(i).XKILLBOX, bombers(i).YKILLBOX), iconspeed
                CASE 2
                    _PUTIMAGE (bombers(i).XKILLBOX, bombers(i).YKILLBOX), iconwidth
                CASE 3
                    _PUTIMAGE (bombers(i).XKILLBOX, bombers(i).YKILLBOX), icondamage
                CASE 4
                    _PUTIMAGE (bombers(i).XKILLBOX, bombers(i).YKILLBOX), iconscrapstorm
                CASE 5
                    _PUTIMAGE (bombers(i).XKILLBOX, bombers(i).YKILLBOX), iconrapidlaser
                CASE 6
                    _PUTIMAGE (bombers(i).XKILLBOX, bombers(i).YKILLBOX), iconsinglelaser
                CASE 7
                    _PUTIMAGE (bombers(i).XKILLBOX, bombers(i).YKILLBOX), iconscrapcannon
            END SELECT

        END IF

    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB movecruisers___ENEMY '===============================================================SUB MOVE CRUISERS ENEMY

    FOR i = 1 TO numcruisers
        RANDOMIZE TIMER

        IF cruisers(i).FIRING = 0 AND cruisers(i).KILLED = 0 AND cruisers(i).STOPPED = 0 THEN ' - if cruiser not shot down and hasn't stopped

            ' - cruisers warp onto the screen!
            cruisers(i).CRUISERSPEED = cruisers(i).CRUISERSPEED - 1 ' - decrease cruiser speed gradually
            IF cruisers(i).CRUISERSPEED <= 1 THEN cruisers(i).CRUISERSPEED = 1 ' - minimum speed of 1
            cruisers(i).Y = cruisers(i).Y + cruisers(i).CRUISERSPEED

            IF cruisers(i).Y + (cruisers(i).HEIGHT / 2) >= 0 THEN ' - if half of cruiser is visible
                cruisers(i).VISIBLE = 1
            END IF

            IF cruisers(i).Y >= cruisers(i).STOPPINGY THEN ' - if cruiser reaches stopping point
                cruisers(i).STOPPED = 1
            END IF
        END IF

        IF cruisers(i).KILLED = 0 AND cruisers(i).STOPPED = 1 THEN
            IF cruisers(i).HEALTH <= 750 THEN cruisers(i).Y = cruisers(i).Y + 1
            IF cruisers(i).Y > win.BOTTOM THEN cruisers(i).Y = (win.HEIGHT / 2) - cruisers(i).HEIGHT * 3 'TEST
        END IF

        IF cruisers(i).KILLED = 0 THEN
            SELECT CASE cruisers(i).HEALTH
                CASE 1500
                    _PUTIMAGE (cruisers(i).X, cruisers(i).Y), cruiserunit
                CASE 1000 TO 1499
                    cruisers(i).WIDTH = 138
                    _PUTIMAGE (cruisers(i).X, cruisers(i).Y), cruiserdmg1
                CASE 500 TO 999
                    cruisers(i).WIDTH = 125
                    cruisers(i).HEIGHT = 186
                    _PUTIMAGE (cruisers(i).X, cruisers(i).Y), cruiserdmg2
                CASE 1 TO 499
                    cruisers(i).WIDTH = 118
                    cruisers(i).HEIGHT = 175
                    _PUTIMAGE (cruisers(i).X, cruisers(i).Y), cruiserdmg3
            END SELECT
        END IF

        IF cruisers(i).KILLED = 1 AND cruisers(i).ICONPICKEDUP = 0 THEN ' if cruiser destroyed but icon not picked up
            cruisers(i).HEIGHT = 50
            cruisers(i).WIDTH = 50

            SELECT CASE cruisers(i).RANDOMICON

                CASE 1
                    _PUTIMAGE (cruisers(i).XKILLBOX, cruisers(i).YKILLBOX), iconspeed
                CASE 2
                    _PUTIMAGE (cruisers(i).XKILLBOX, cruisers(i).YKILLBOX), iconwidth
                CASE 3
                    _PUTIMAGE (cruisers(i).XKILLBOX, cruisers(i).YKILLBOX), icondamage
                CASE 4
                    _PUTIMAGE (cruisers(i).XKILLBOX, cruisers(i).YKILLBOX), iconscrapstorm
                CASE 5
                    _PUTIMAGE (cruisers(i).XKILLBOX, cruisers(i).YKILLBOX), iconrapidlaser
                CASE 6
                    _PUTIMAGE (cruisers(i).XKILLBOX, cruisers(i).YKILLBOX), iconsinglelaser
                CASE 7
                    _PUTIMAGE (cruisers(i).XKILLBOX, cruisers(i).YKILLBOX), iconscrapcannon

            END SELECT

        END IF

    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB movefighters___ENEMY '==============================================================SUB MOVE FIGHTERS ENEMY

    FOR inf = 1 TO numfighters
        'FOR i = 1 TO numfighters
        RANDOMIZE TIMER

        IF fighters(inf).ACTIVE = fighterwave AND fighters(inf).KILLED = 0 AND fighters(inf).SHIELDON = 0 THEN '       - if fighter alive and unshielded '1

            fighters(inf).Y = fighters(inf).Y + fighters(inf).FIGHTERSPEED '      - calculate fighter movement on y

            IF fighters(inf).X + fighters(inf).WIDTH >= win.RIGHT THEN fighters(inf).X = win.RIGHT - (fighters(inf).WIDTH) '- keep fighter from going off screen on x ...

            IF fighters(inf).X <= win.LEFT THEN fighters(inf).X = win.LEFT '                      - keeps fighter from going off screen on x ...

            IF fighters(inf).Y >= win.BOTTOM THEN '     - if fighter survives to screen bottom
                fighters(inf).X = INT(RND * win.WIDTH - fighters(inf).WIDTH)
                fighters(inf).Y = INT(RND * win.HEIGHT - 50) * -1
            END IF

            SELECT CASE fighters(inf).HEALTH
                CASE IS = 300
                    _PUTIMAGE (fighters(inf).X, fighters(inf).Y), fighterunit
                CASE 200 TO 299
                    fighters(inf).WIDTH = 98
                    fighters(inf).HEIGHT = 56
                    _PUTIMAGE (fighters(inf).X, fighters(inf).Y), fighterdmg1
                CASE 100 TO 199
                    fighters(inf).WIDTH = 96
                    fighters(inf).HEIGHT = 56
                    _PUTIMAGE (fighters(inf).X, fighters(inf).Y), fighterdmg2
                CASE 1 TO 99
                    fighters(inf).WIDTH = 94
                    fighters(inf).HEIGHT = 56
                    _PUTIMAGE (fighters(inf).X, fighters(inf).Y), fighterdmg3
            END SELECT

        END IF

        IF fighters(inf).ACTIVE = fighterwave AND fighters(inf).KILLED = 0 AND fighters(inf).SHIELDON = 1 THEN '          - if fighter alive and shielded  '1

            IF fighters(inf).XKILLBOX < player.XKILLBOX THEN fighters(inf).X = fighters(inf).X + 1
            IF fighters(inf).XKILLBOX > player.XKILLBOX THEN fighters(inf).X = fighters(inf).X - 1
            fighters(inf).Y = fighters(inf).Y + 3

            IF fighters(inf).Y >= win.BOTTOM THEN '     - if fighter survives to screen bottom
                fighters(inf).X = INT(RND * win.WIDTH - fighters(inf).WIDTH)
                fighters(inf).Y = INT(RND * win.HEIGHT - 50) * -1
            END IF

            SELECT CASE fighters(inf).SHIELDHEALTH
                CASE 200
                    fighters(inf).HEIGHT = 76
                    _PUTIMAGE (fighters(inf).X, fighters(inf).Y), shieldgif(1)
                CASE 150 TO 199
                    fighters(inf).HEIGHT = 72
                    _PUTIMAGE (fighters(inf).X, fighters(inf).Y), shieldgif(2)
                CASE 100 TO 149
                    fighters(inf).HEIGHT = 68
                    _PUTIMAGE (fighters(inf).X, fighters(inf).Y), shieldgif(3)
                CASE 50 TO 99
                    fighters(inf).HEIGHT = 64
                    _PUTIMAGE (fighters(inf).X, fighters(inf).Y), shieldgif(4)
                CASE IS <= 49
                    fighters(inf).HEIGHT = 60
                    _PUTIMAGE (fighters(inf).X, fighters(inf).Y), shieldgif(5)
            END SELECT

        END IF
        '--------------------------------------------if fighter is now scrap
        IF fighters(inf).KILLED = 1 AND fighters(inf).ICONPICKEDUP = 0 THEN ' if fighter destroyed but icon not picked up

            IF fightersicon(inf).VALUESCOPIED = 0 THEN
                fighters(inf).WIDTH = 50
                fighters(inf).HEIGHT = 50

                fightersicon(inf).WIDTH = fighters(inf).WIDTH ' copies values
                fightersicon(inf).HEIGHT = fighters(inf).HEIGHT
                fightersicon(inf).X = fighters(inf).X
                fightersicon(inf).Y = fighters(inf).Y
                fightersicon(inf).XKILLBOX = fighters(inf).XKILLBOX
                fightersicon(inf).YKILLBOX = fighters(inf).YKILLBOX
                fightersicon(inf).ICONPICKEDUP = fighters(inf).ICONPICKEDUP
                fightersicon(inf).RANDOMICON = fighters(inf).RANDOMICON
                fightersicon(inf).KILLED = fighters(inf).KILLED
                fightersicon(inf).SHIELDON = fighters(inf).SHIELDON
                fightersicon(inf).ACTIVE = fighters(inf).ACTIVE
                fightersicon(inf).VALUESCOPIED = 1

                fighters(inf).X = -500 ' changes original data to prevent conflict (IN THEORY)
                fighters(inf).Y = -500
                fighters(inf).XKILLBOX = -500
                fighters(inf).YKILLBOX = -500
            END IF

        END IF

        IF fightersicon(inf).KILLED = 1 AND fightersicon(inf).ICONPICKEDUP = 0 THEN

            SELECT CASE fightersicon(inf).RANDOMICON

                CASE 1
                    _PUTIMAGE (fightersicon(inf).XKILLBOX, fightersicon(inf).YKILLBOX), iconspeed
                CASE 2
                    _PUTIMAGE (fightersicon(inf).XKILLBOX, fightersicon(inf).YKILLBOX), iconwidth
                CASE 3
                    _PUTIMAGE (fightersicon(inf).XKILLBOX, fightersicon(inf).YKILLBOX), icondamage
                CASE 4
                    _PUTIMAGE (fightersicon(inf).XKILLBOX, fightersicon(inf).YKILLBOX), iconscrapstorm
                CASE 5
                    _PUTIMAGE (fightersicon(inf).XKILLBOX, fightersicon(inf).YKILLBOX), iconrapidlaser
                CASE 6
                    _PUTIMAGE (fightersicon(inf).XKILLBOX, fightersicon(inf).YKILLBOX), iconsinglelaser
                CASE 7
                    _PUTIMAGE (fightersicon(inf).XKILLBOX, fightersicon(inf).YKILLBOX), iconscrapcannon

            END SELECT

        END IF

    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB scrapstorm___ENEMY

    FOR si = 1 TO scrapstormcollected
        scrapstorm(si).Y = scrapstorm(si).Y - 7
        _PUTIMAGE (scrapstorm(si).X, scrapstorm(si).Y), scrapstorm(si).PIC

        FOR inf = 1 TO numfighters
            IF (fighters(inf).KILLED) = 0 AND (scrapstorm(si).X + scrapstorm(si).WIDTH >= fighters(inf).X) AND (scrapstorm(si).X <= fighters(inf).X + fighters(inf).WIDTH) AND (scrapstorm(si).Y <= fighters(inf).YKILLBOX) AND (scrapstorm(si).Y + scrapstorm(si).HEIGHT >= fighters(inf).Y) THEN
                fighters(inf).HEALTH = fighters(inf).HEALTH - 50
                blastnum = 1
                DO WHILE blastnum < fivecount
                    _PUTIMAGE (scrapstorm(si).X, fighters(inf).Y + fighters(inf).RANDOMY), blastgif(blastnum)
                    blastnum = blastnum + 1
                LOOP
                scrapstorm(si).X = INT(RND * win.WIDTH) + 1 ' reset scrap location
                scrapstorm(si).Y = INT(RND * win.HEIGHT) + win.HEIGHT + 10
                scrapoffscreen = scrapoffscreen + 1
                IF fighters(inf).HEALTH <= 0 THEN
                    fighters(inf).KILLED = 1
                    RANDOMIZE TIMER
                    arbicon = INT(RND * 2)
                    shotdown = shotdown + 1
                    fightersdown = fightersdown + 1
                    IF arbicon = 1 THEN
                        fighters(inf).ICONPICKEDUP = 0
                        fighters(inf).RANDOMICON = (INT(RND * 7) + 1)
                    END IF
                END IF
            END IF
        NEXT

        FOR i = 1 TO numbombers
            IF (bombers(i).KILLED) = 0 AND (scrapstorm(si).X + scrapstorm(si).WIDTH >= bombers(i).X) AND (scrapstorm(si).X <= bombers(i).X + bombers(i).WIDTH) AND (scrapstorm(si).Y <= bombers(i).YKILLBOX) AND (scrapstorm(si).Y + scrapstorm(si).HEIGHT >= bombers(i).Y) THEN
                bombers(i).HEALTH = bombers(i).HEALTH - 50
                blastnum = 1
                DO WHILE blastnum < fivecount
                    _PUTIMAGE (scrapstorm(si).X, bombers(i).Y + bombers(i).RANDOMY), blastgif(blastnum)
                    blastnum = blastnum + 1
                LOOP
                scrapstorm(si).X = INT(RND * win.WIDTH) + 1 ' reset scrap location
                scrapstorm(si).Y = INT(RND * win.HEIGHT) + win.HEIGHT + 10
                scrapoffscreen = scrapoffscreen + 1
                IF bombers(i).HEALTH <= 0 THEN
                    bombers(i).KILLED = 1
                    RANDOMIZE TIMER
                    arbicon = INT(RND * 2)
                    shotdown = shotdown + 1
                    bombersdown = bombersdown + 1
                    IF arbicon = 1 THEN
                        bombers(i).ICONPICKEDUP = 0
                        bombers(i).RANDOMICON = (INT(RND * 7) + 1)
                    END IF
                END IF
            END IF
        NEXT

        FOR i = 1 TO numcruisers
            IF (cruisers(i).KILLED) = 0 AND (scrapstorm(si).X + scrapstorm(si).WIDTH >= cruisers(i).X) AND (scrapstorm(si).X <= cruisers(i).X + cruisers(i).WIDTH) AND (scrapstorm(si).Y <= cruisers(i).YKILLBOX) AND (scrapstorm(si).Y + scrapstorm(si).HEIGHT >= cruisers(i).Y) THEN
                cruisers(i).HEALTH = cruisers(i).HEALTH - 50
                blastnum = 1
                DO WHILE blastnum < fivecount
                    _PUTIMAGE (scrapstorm(si).X, cruisers(i).Y + cruisers(i).RANDOMY), blastgif(blastnum)
                    blastnum = blastnum + 1
                LOOP
                scrapstorm(si).X = INT(RND * win.WIDTH) + 1 ' reset scrap location
                scrapstorm(si).Y = INT(RND * win.HEIGHT) + win.HEIGHT + 10
                scrapoffscreen = scrapoffscreen + 1
                IF cruisers(i).HEALTH <= 0 THEN
                    cruisers(i).KILLED = 1
                    RANDOMIZE TIMER
                    arbicon = INT(RND * 2)
                    shotdown = shotdown + 1
                    cruisersdown = cruisersdown + 1
                    IF arbicon = 1 THEN
                        cruisers(i).ICONPICKEDUP = 0
                        cruisers(i).RANDOMICON = (INT(RND * 7) + 1)
                    END IF
                END IF
            END IF
        NEXT

        FOR i = 1 TO numbships
            IF (bships(i).KILLED) = 0 AND (scrapstorm(si).X + scrapstorm(si).WIDTH >= bships(i).X) AND (scrapstorm(si).X <= bships(i).X + bships(i).WIDTH) AND (scrapstorm(si).Y <= bships(i).HEIGHT / 2) AND (scrapstorm(si).Y + scrapstorm(si).HEIGHT >= bships(i).Y) THEN
                bships(i).HEALTH = bships(i).HEALTH - 50
                blastnum = 1
                DO WHILE blastnum < fivecount
                    _PUTIMAGE (scrapstorm(si).X, bships(i).Y + bships(i).RANDOMY), blastgif(blastnum)
                    blastnum = blastnum + 1
                LOOP
                scrapstorm(si).X = INT(RND * win.WIDTH) + 1 ' reset scrap location
                scrapstorm(si).Y = INT(RND * win.HEIGHT) + win.HEIGHT + 10
                scrapoffscreen = scrapoffscreen + 1
                IF bships(i).HEALTH <= 0 THEN
                    bships(i).KILLED = 1
                    RANDOMIZE TIMER
                    arbicon = INT(RND * 2)
                    shotdown = shotdown + 1
                    bshipsdown = bshipsdown + 1
                    IF arbicon = 1 THEN
                        'bships(i).ICONPICKEDUP = 0
                        'bships(i).RANDOMICON = (INT(RND * 7) + 1)
                    END IF
                END IF
            END IF
        NEXT

        IF scrapstorm(si).Y <= 0 THEN
            scrapoffscreen = scrapoffscreen + 1
            scrapstorm(si).X = INT(RND * win.WIDTH) + 1 ' reset scrap location
            scrapstorm(si).Y = INT(RND * win.HEIGHT) + win.HEIGHT + 10
        END IF
    NEXT
    IF scrapoffscreen >= scrapstormcollected THEN
        scrapstormscript = 0
        scrapcollected = scrapcollected - scrapoffscreen
        scrapoffscreen = 0
    END IF

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB laserstorm___ENEMY '========================================================================= SUB LASER STORM ENEMY
    RANDOMIZE TIMER
    FOR i = 1 TO laserstormcount
        lstorm(i).Y = lstorm(i).Y + lstorm(i).SPEED

        _PUTIMAGE (lstorm(i).X, lstorm(i).Y), laserstorm

        ' if lasers hit player killbox

        IF (player.XKILLBOX >= lstorm(i).X) AND (player.XKILLBOX <= lstorm(i).X + lstorm(i).WIDTH) AND (player.YKILLBOX <= lstorm(i).Y + lstorm(i).HEIGHT) AND (player.YKILLBOX >= lstorm(i).Y) THEN
            player.KILLED = 1
            playerhitanimation___PLAYER
            lstorm(i).X = INT(RND * (win.WIDTH - lstorm(i).WIDTH))
            lstorm(i).Y = INT((RND * 1500) + 1000) * -1 'win.height * 2
            lasersoffscreen = lasersoffscreen + 1
        END IF

        ' - shot hits grey zone. 75 damage
        IF (lstorm(i).X >= player.X) AND (lstorm(i).X + lstorm(i).WIDTH <= player.X + player.WIDTH) AND (player.Y <= lstorm(i).Y + lstorm(i).HEIGHT) AND (player.Y + player.HEIGHT >= lstorm(i).Y) THEN
            player.HEALTH = player.HEALTH - lstorm(i).DAMAGE '  - calculate new player health
            playerhitanimation___PLAYER
            lstorm(i).X = INT(RND * (win.WIDTH - lstorm(i).WIDTH))
            lstorm(i).Y = INT((RND * 1500) + 1000) * -1
            lasersoffscreen = lasersoffscreen + 1
        END IF

        ' - if lasers go off screen
        IF lstorm(i).Y >= 1200 THEN
            lstorm(i).Y = INT((RND * 1500) + 1000) * -1
            lstorm(i).X = INT(RND * (win.WIDTH - lstorm(i).WIDTH))
            lasersoffscreen = lasersoffscreen + 1
        END IF

    NEXT

    IF lasersoffscreen >= laserstormcount THEN
        laserstormscript = 0
        lasersoffscreen = 0
    END IF

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

'                                               !!!  BOSS subroutines !!!

'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB moveboss1___BOSS '==========================================================SUB MOVE BOSS 1

    RANDOMIZE TIMER
    move = INT(RND * 100) + 1
    IF move < 25 THEN
        boss1.Y = boss1.Y + 3
        IF boss1.Y >= 540 THEN boss1.Y = 540
    END IF

    IF move < 10 THEN boss1.X = boss1.X - 1

    _PUTIMAGE (boss1.X, boss1.Y), boss1.PIC

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB randomboss1___BOSS '==============================================================SUB RANDOM BOSS 1

    RANDOMIZE TIMER
    boss1.X = INT(RND * 270) + 540
    boss1.Y = INT(RND * 1080) * -1
    boss1.WIDTH = 300
    boss1.HEIGHT = 500
    boss1scriptran = 1

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB boss1hitdetect___BOSS '====================================================SUB BOSS 1 HIT DETECT BOSS

    IF (player.X + player.WIDTH >= boss1.X) AND (player.X <= boss1.X + boss1.WIDTH) AND (player.Y <= boss1.Y + boss1.HEIGHT) AND (player.Y + player.HEIGHT >= boss1.Y) THEN
        player.KILLED = 1
    END IF

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

'                                               !!!  MISC subroutines !!!

'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB movescrap___MISC '=====================================================================SUB MOVE SCRAP MISC

    FOR i = 1 TO numscrap

        IF scrap(i).COLLECTED = 0 THEN
            RANDOMIZE TIMER
            move = INT(RND * RND * 100) + 1
            IF move < 10 THEN scrap(i).X = scrap(i).X + 1 '                            - move scrap right
            IF move < 5 AND scrap(i).X < (win.WIDTH / 2) AND scrap(i).X >= 0 THEN scrap(i).Y = scrap(i).Y + 1 '   - move scrap down on left side of screen
            IF move < 5 AND scrap(i).X > (win.WIDTH / 2) AND scrap(i).X <= win.WIDTH THEN scrap(i).Y = scrap(i).Y - 1 '   - move scrap up on right side of screen
            IF scrap(i).X >= win.RIGHT THEN
                scrap(i).X = INT(RND * win.WIDTH) * -1 '   - loop scrap back around
                scrap(i).Y = INT(RND * 250) + 200
            END IF
            'IF move < 10 AND scrap(i).Y > win.BOTTOM THEN scrap(i).Y = scrap(i).Y - 1 'scrap comes up if drops too low
            'IF move < 10 AND scrap(i).Y < win.TOP THEN scrap(i).Y = scrap(i).Y + 1 ' scrap comes down if drops too low
            _PUTIMAGE (scrap(i).X, scrap(i).Y), scrap(i).PIC
        END IF
    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB explosions___MISC '======================================================SUB EXPLOSIONS MISC

    FOR inf = 1 TO numfighters
        IF fighters(inf).KILLHIT = 1 THEN
            IF blastnum < 6 THEN
                _PUTIMAGE (fighters(inf).SHOTX, fighters(inf).SHOTY), blastgif(blastnum) 'blastgif(blastnum)
                blastnum = blastnum + 1
            END IF

        END IF

        IF fighters(inf).GRAZEHIT = 1 THEN
            IF blastnum < 6 THEN
                _PUTIMAGE (fighters(inf).SHOTX, fighters(inf).SHOTY), blastgif(blastnum)
                blastnum = blastnum + 1
            END IF

        END IF

        IF blastnum >= 6 THEN
            blastnum = 1
            fighters(inf).KILLHIT = 0
            fighters(inf).GRAZEHIT = 0
            fighters(inf).SHOTX = -500
            fighters(inf).SHOTY = -500
        END IF

    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB movebackgroundscrap___MISC '=============================================SUB MOVE BACKGROUND SCRAP MISC

    FOR i = 1 TO bscrap
        RANDOMIZE TIMER
        move = INT(RND * 100) + 1
        IF move < 7 THEN bgscrap(i).X = bgscrap(i).X - 1
        IF move < 5 AND bgscrap(i).X > win.LEFT THEN bgscrap(i).Y = bgscrap(i).Y + 1
        IF bgscrap(i).X < win.LEFT THEN bgscrap(i).X = INT(RND * 100) + win.RIGHT
        _PUTIMAGE (bgscrap(i).X, bgscrap(i).Y), bgscrap(i).PIC
    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB controls___MISC '==================================================================SUB CONTROLS MISC

    '-----------------------------------------FONTS
    largefontint = 32
    medfontint = 20
    gamefontlrg = _LOADFONT("SCRAPSHIP\x\fonts\23XX.otf", 32)
    IF gamefontlrg THEN _FONT gamefontlrg
    largefontint = _ROUND(32 / 2)
    gamefontmed = _LOADFONT("SCRAPSHIP\x\fonts\23XX.otf", 20)
    IF gamefontmed THEN _FONT gamefontmed
    medfontint = _ROUND(20 / 2)

    _FONT gamefontlrg
    LOCATE 4, 350: PRINT "basic controls"
    LOCATE 12, 300: PRINT "arrow keys": LOCATE 12, 550: PRINT "move"
    LOCATE 13, 300: PRINT "space bar": LOCATE 13, 550: PRINT "fire weapon"
    LOCATE 14, 300: PRINT "p": LOCATE 14, 550: PRINT "pause game / weapon info"
    LOCATE 15, 300: PRINT "esc": LOCATE 15, 550: PRINT "exit game"
    _FONT gamefontmed
    LOCATE 30, 150: PRINT "screen size can be adjusted by grabbing the window corners"
    _DISPLAY

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB randomcolors___MISC '===================================================SUB RANDOM COLORS MISC

    clr = INT(RND * 4) + 1

    SELECT CASE clr
        CASE 1
            clr = _RGB(255, 0, 0) 'red
        CASE 2
            clr = _RGB(255, 255, 0) 'yellow
        CASE 3
            clr = _RGB(255, 128, 0) 'orange
        CASE 4
            clr = _RGB(255, 255, 255) 'white
    END SELECT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB setletters___MISC '=====================================================SUB SET LETTERS MISC

    FOR i = 1 TO lettersum
        path$ = "SCRAPSHIP\x\gfx\" + LTRIM$(STR$(i)) + ".png"
        lscrap(i).PIC = _LOADIMAGE(path$)
        IF i = 1 THEN lscrap(i).X = 850
        IF i <> 1 THEN lscrap(i).X = lscrap(i - 1).X - 90
        lscrap(i).Y = 150
    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB stattext___MISC

    A$ = "YOU SURVIVED!"
    LOCATE 8, 380: PRINT A$
    PRINT "                "
    PRINT "                "
    PRINT "                "

    E$ = "HIT PERCENTAGE: "
    LOCATE 12, 340: PRINT E$; hitrate
    PRINT "               "

    FDOWN$ = "FIGHTERS DESTROYED: "
    LOCATE 14, 340: PRINT FDOWN$; fightersdown

    BDOWN$ = "BOMBERS DESTROYED: "
    LOCATE 15, 340: PRINT BDOWN$; bombersdown

    CDOWN$ = "CRUISERS DESTROYED: "
    LOCATE 16, 340: PRINT CDOWN$; cruisersdown

    BSDOWN$ = "BATTLESHIPS DESTROYED: "
    LOCATE 17, 340: PRINT BSDOWN$; bshipsdown
    PRINT "                       "

    C$ = "PLAY AGAIN?"
    c = LEN(C$)
    CX = (win.RIGHT / 2) - (c * c) 'lrgfontint)
    LOCATE 19, CX: PRINT C$

    D$ = "y / n"
    d = LEN(D$)
    DX = (win.RIGHT / 2) - (d * d) - 30 'lrgfontint)
    LOCATE 20, DX: PRINT D$

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB clearletters___MISC '============================================================SUB CLEAR LETTERS MISC

    FOR i = 1 TO lettersum
        lscrap(i).X = -500
        lscrap(i).Y = -500
    NEXT

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB escapekey___MISC '===============================================================SUB ESCAPE KEY TO EXIT MISC

    IF k = 27 THEN SYSTEM 'ESC KEY

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB credits___MISC '============================================================SUB CREDITS MISC

    '_FONT gamefontlrg
    'LOCATE 1, 460: PRINT "credits": LOCATE 8, 460: PRINT "music by": LOCATE 12, 420: PRINT "Tyson Cazier"
    '_DISPLAY
    'SLEEP 3

    pcopydisplay___MISC
    LOCATE 1, 460: PRINT "credits": LOCATE 8, 160: PRINT "spaceship models created in blender by": LOCATE 12, 320: PRINT "another_blender_user"
    _PUTIMAGE (400, 400), cruiserunit
    _PUTIMAGE (600, 500), player.PIC
    _PUTIMAGE (100, 600), carriersideunit
    _DISPLAY
    SLEEP 3

    pcopydisplay___MISC
    LOCATE 1, 460: PRINT "credits": LOCATE 8, 320: PRINT "sound effects created by": LOCATE 12, 420: PRINT "mariosello1"
    _DISPLAY
    SLEEP 3

    pcopydisplay___MISC
    LOCATE 1, 460: PRINT "credits": LOCATE 8, 350: PRINT "23xx font created by": LOCATE 12, 420: PRINT "Tevinbloise"
    _DISPLAY
    SLEEP 3

    pcopydisplay___MISC
    LOCATE 1, 460: PRINT "credits"
    _FONT gamefontmed
    LOCATE 4, 460: PRINT "Itch.io": LOCATE 7, 460: PRINT "Time Stop Dev": LOCATE 8, 460: PRINT "TheSneak": LOCATE 9, 460: PRINT "Malerouille"
    LOCATE 10, 460: PRINT "sepi.gamedev"
    _DISPLAY
    SLEEP 3

    pcopydisplay___MISC
    LOCATE 1, 460: PRINT "credits"
    _FONT gamefontmed
    LOCATE 4, 460: PRINT "qb64 forums": LOCATE 7, 460: PRINT "FillippeHeitor": LOCATE 8, 460: PRINT "bplus": LOCATE 9, 460: PRINT "Petr"
    LOCATE 10, 460: PRINT "TerryRitchie": LOCATE 11, 460: PRINT "MasterGy": LOCATE 12, 460: PRINT "SMcNeill": LOCATE 13, 460: PRINT "STxAxTIC"
    LOCATE 14, 460: PRINT "OldMoses": LOCATE 15, 460: PRINT "TempodiBasic"
    _DISPLAY
    SLEEP 4

    pcopydisplay___MISC
    LOCATE 1, 460: PRINT "credits"
    _FONT gamefontmed
    LOCATE 4, 360: PRINT "first 100 instagram followers"
    _PUTIMAGE (0, 100), creditsinsta
    _DISPLAY
    SLEEP 5

    pcopydisplay___MISC
    LOCATE 1, 460: PRINT "credits"
    _FONT gamefontmed
    LOCATE 4, 420: PRINT "last, but not least . . .": LOCATE 7, 420: PRINT "God, family, friends . . ."
    _DISPLAY
    SLEEP 3

    pcopydisplay___MISC
    LOCATE 1, 460: PRINT "credits"
    _FONT gamefontlrg
    LOCATE 10, 430: PRINT ". . . and you!"
    _DISPLAY
    SLEEP 3
    menucase = 1
    selector.X = 350
    selector.Y = 545

END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB pcopydisplay___MISC
    PCOPY 1, _DISPLAY
    PCOPY _DISPLAY, 1
    _FONT gamefontlrg
END SUB
'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
SUB debugtools___MISC '=========================================================SUB PLACEMENT TOOLS MISC

    IF animation2ran = 1 THEN
        SELECT EVERYCASE loadlevel '        - determine what debug tools to load based on level
            CASE IS >= 1
                _FONT gamefontmed
                LOCATE 1, 1: PRINT "HP: "; player.HEALTH
                'texty = player.Y / 19
                'LOCATE texty, player.X + (player.WIDTH / 2): PRINT player.HEALTH
                'LOCATE 48, 1: PRINT "HP: "; player.HEALTH
                PRINT "Scrap: "; scrapcollected ' - scrapoffscreen; " /"; numscrap
                'PRINT hitrate 'shothit / shotmissed
                'CASE IS >= 2
                'LOCATE 3, 1: PRINT "Shotdown: "; shotdown; " /"; numall
                'PRINT "espeed: "; eupgradespeed
                'PRINT "ewidth: "; eupgradewidth
                'PRINT "edmg: "; eupgradedamage
                'PRINT "esn: "; eshotnum
                'PRINT "shotnum: "; shotnum
                'PRINT "tdamage: "; totaldamage
                'PRINT "bdamage: "; basedamage
                'PRINT "keydelay: "; playerkeydelay
        END SELECT
    END IF

END SUB
