' 30 MAR 2020 === PUBLIC DEMO 2 !!!  ===
'                       'BUG: ENEMY SHIPS SPAWN OVER INCOMING TEXT.

'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 = 15 ' 10                   - sets maximum number of player shots
CONST lettersum = 9 '                   - number of letters in "SCRAPSHIP"
CONST maxrotation = 358 '               - allows for up to 360 frames of planet rotation
CONST endblast = 5 '                    - sets number of explosion frames

TYPE PLAYER
    PIC AS LONG
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    MIDX AS SINGLE
    MIDY AS SINGLE
    X AS INTEGER '
    Y AS INTEGER
    HEALTH AS INTEGER
    SPEED AS INTEGER
    SCRAP AS INTEGER
    KILLED AS INTEGER
END TYPE

TYPE LETTERSCRAP
    PIC AS LONG
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    SPEED AS INTEGER
    COUNT AS INTEGER
    COLLECTED AS INTEGER
END TYPE

TYPE SCRAP
    PIC AS LONG
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    SPEED AS INTEGER
    COUNT AS INTEGER
    COLLECTED 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 SINGLESHOT
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    MIDX AS SINGLE
    SPEED AS INTEGER
    RANGE AS INTEGER
    DAMAGE AS INTEGER
    ACTIVE AS _BYTE
END TYPE

TYPE MULTISHOT
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    MIDX AS SINGLE
    X AS INTEGER
    Y AS INTEGER
    SPEED AS INTEGER
    DAMAGE AS INTEGER
    ACTIVE AS _BYTE
END TYPE

TYPE SCRAPSHOT
    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 FIGHTERSHOT
    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 'INTEGER
    Y AS SINGLE 'INTEGER
    SPEED AS INTEGER
    DAMAGE AS INTEGER
END TYPE

TYPE FIGHTERS
    HEIGHT1 AS INTEGER
    HEIGHT2 AS INTEGER
    WIDTH1 AS INTEGER
    WIDTH2 AS INTEGER
    X1 AS INTEGER
    X2 AS INTEGER
    MIDX1 AS SINGLE
    Y1 AS INTEGER
    Y2 AS INTEGER
    HEALTH1 AS INTEGER
    HEALTH2 AS INTEGER
    HEALTHTOTAL AS INTEGER
    FIGHTERSPEED AS INTEGER
    VISIBLE1 AS INTEGER
    VISIBLE2 AS INTEGER
    REFY AS INTEGER
    KILLED1 AS INTEGER
    KILLED2 AS INTEGER
    ACTIVE AS INTEGER
    DISTANCE AS INTEGER
    ODDSOFACTIVE AS INTEGER
    PLAYERPOSITION AS INTEGER
END TYPE

TYPE BOMBERS
    HEIGHT1 AS INTEGER
    HEIGHT2 AS INTEGER
    WIDTH1 AS INTEGER
    WIDTH2 AS INTEGER
    X1 AS INTEGER
    X2 AS INTEGER
    Y1 AS INTEGER
    Y2 AS INTEGER
    HEALTH1 AS INTEGER
    HEALTH2 AS INTEGER
    BOMBERSPEED AS INTEGER
    VISIBLE1 AS INTEGER
    VISIBLE2 AS INTEGER
    KILLED1 AS INTEGER
    KILLED2 AS INTEGER
    ACTIVE AS INTEGER
END TYPE

TYPE CRUISERS
    HEIGHT1 AS INTEGER
    WIDTH1 AS INTEGER
    X1 AS INTEGER
    Y1 AS INTEGER
    MIDX1 AS SINGLE
    MIDY1 AS SINGLE
    HEALTH1 AS INTEGER
    CRUISERSPEED AS INTEGER
    VISIBLE1 AS INTEGER
    KILLED1 AS INTEGER
    CRUISER AS INTEGER
    STOPPINGY AS INTEGER
    STOPPED AS INTEGER
    ACTIVE AS INTEGER
    DISTANCEX AS SINGLE
    DISTANCEY AS SINGLE
    ODDSOFACTIVE AS INTEGER
    PLAYERPOSITION AS INTEGER
    PLAYERABOVE AS INTEGER
END TYPE

TYPE BATTLESHIPS
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    HEALTH1 AS INTEGER
    HEALTH2 AS INTEGER
    BATTLESHIPSPEED AS INTEGER
    VISIBLE AS INTEGER
    KILLED AS INTEGER
    STOPPINGY 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 VOLUMEDOWN
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    SOUNDSPEED AS INTEGER
    VISIBLE AS INTEGER
    SETTINGSTOPY AS INTEGER
    ACTIVE AS INTEGER
END TYPE

TYPE VOLUMEUP
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y AS INTEGER
    SOUNDSPEED AS INTEGER
    VISIBLE AS INTEGER
    SETTINGSTOPY AS INTEGER
    ACTIVE AS INTEGER
END TYPE

TYPE PRESSENTER
    HEIGHT AS INTEGER
    WIDTH AS INTEGER
    X AS INTEGER
    Y 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
    MIDX AS INTEGER
    MIDY AS INTEGER
    TOP AS INTEGER
    BOTTOM AS INTEGER
    RIGHT AS INTEGER
    LEFT AS INTEGER
END TYPE

'================================================SCRIPT BOOLEANS
DIM SHARED lasershotscriptran AS INTEGER
DIM SHARED multishotscriptran AS INTEGER
DIM SHARED foregroundscrapscriptran AS INTEGER
DIM SHARED boss1scriptran AS INTEGER
DIM SHARED backgroundscrapscriptran AS INTEGER
DIM SHARED setlettersscriptran AS INTEGER
DIM SHARED rotationscript AS INTEGER
DIM SHARED healthscriptran AS INTEGER

'===============================================REGULAR BOOLEANS
DIM SHARED playermovingleft AS INTEGER
DIM SHARED playermovingright AS INTEGER
DIM SHARED playerdefault AS INTEGER
DIM SHARED issoundon AS INTEGER
DIM SHARED isaudioon AS INTEGER
DIM SHARED sounddelay AS INTEGER
DIM SHARED endcredits 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 '*5 + 10
numfighters = INT(RND * 5) + 10

DIM SHARED numbombers AS INTEGER
numbombers = INT(RND * 5) + 1

DIM SHARED numcruisers AS INTEGER '*5 + 2
numcruisers = INT(RND * 5) + 2

DIM SHARED numbships AS INTEGER
numbships = 2

DIM SHARED numcarriers AS INTEGER
numcarriers = 1

DIM SHARED numall AS INTEGER
numall = numfighters + numcruisers

'==========================================================ARRAYS AND ARRAY TYPES
DIM SHARED lscrap(lettersum) AS LETTERSCRAP
DIM SHARED scrap(numscrap) AS SCRAP
DIM SHARED bgscrap(bscrap) AS BACKGROUNDSCRAP
DIM SHARED xshot(maxshots) AS MULTISHOT
DIM SHARED sshot(maxshots) AS SCRAPSHOT
DIM SHARED fighters(numfighters) AS FIGHTERS
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 cshot(numcruisers) AS CRUISERSHOT
DIM SHARED planetrotation(maxrotation) AS LONG
DIM SHARED blastgif(endblast) AS LONG

'==========================================================IN-GAME COUNTERS
DIM SHARED scrapcollected AS INTEGER
scrap(numscrap).COUNT = numscrap

'==========================================================NON-ARRAY TYPES
DIM SHARED player AS PLAYER
DIM SHARED win AS WINDOW
DIM SHARED oneshot AS SINGLESHOT
DIM SHARED voldown AS VOLUMEDOWN
DIM SHARED volup AS VOLUMEUP
DIM SHARED enter AS PRESSENTER
DIM SHARED selector AS SELECTOR

'=======================================================STANDALONE VARIABLES
DIM SHARED keydelay AS INTEGER
DIM SHARED loadlevel AS INTEGER
DIM SHARED levelinit AS INTEGER
DIM SHARED shotdown AS INTEGER
DIM SHARED irotation AS INTEGER
DIM SHARED iterations AS INTEGER
DIM SHARED soundlevel AS SINGLE
DIM SHARED soundtimer AS SINGLE
DIM SHARED soundlength AS SINGLE

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 levelsound AS LONG
DIM SHARED enemylasersound AS LONG
DIM SHARED singlelaseraudio AS LONG
DIM SHARED rapidlaseraudio AS LONG
DIM SHARED healthcriticalaudio AS LONG
DIM SHARED sethlaser AS LONG

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 fightershotpic AS LONG
DIM SHARED cruisershotpic AS LONG
DIM SHARED bshipunit AS LONG
DIM SHARED cruiserunit AS LONG
DIM SHARED carrierunit AS LONG
DIM SHARED carriersideunit AS LONG
DIM SHARED fighterpart1 AS LONG
DIM SHARED fighterpart2 AS LONG
DIM SHARED fpart1shotdown AS LONG
DIM SHARED fpart2shotdown AS LONG
DIM SHARED fighter1dmg1 AS LONG
DIM SHARED fighter2dmg1 AS LONG
DIM SHARED fighter2dmg2 AS LONG
DIM SHARED fighter2dmg3 AS LONG
DIM SHARED fighter2dmg4 AS LONG
DIM SHARED rapidlaserpic AS LONG
DIM SHARED singlelaserpic AS LONG
DIM SHARED statusbarpic AS LONG ' delete?
DIM SHARED selectorpic AS LONG
DIM SHARED creditsinsta AS LONG
DIM SHARED controlspic 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
DIM SHARED k AS INTEGER ' for key strokes
DIM rw AS INTEGER
DIM rh AS INTEGER
DIM rwide AS STRING
DIM rhigh AS STRING

'=====================================================================================================================
'=====================================================================================================================
'                                               === PRIMARY GAME LOOP ===
'
'
newscreen '
controls '                                      - loads the control instructions
basicsettings '                                 - loads the basic settings for all variables
loadallgameassets '                             - loads sounds and graphics
'IF issoundon = 1 THEN
'_SNDVOL levelsound, soundlevel
'IF levelsound THEN _SNDPLAYCOPY levelsound
'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

    _LIMIT 60 '                                 - 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 '                   - load titlescreen and tutorial
            CASE 1
                level1 '                        - load level 1
            CASE 2
                level2 '                        - load level 2
        END SELECT

        playercollisioncheck
        debugtools

        IF player.HEALTH < 30 AND isaudioon = 1 AND healthscriptran = 0 THEN
            _SNDVOL healthcriticalaudio, soundlevel
            _SNDPLAYCOPY healthcriticalaudio
            healthscriptran = 1
        END IF

        ' --------------------------------   PLAYER SURVIVES   -------------------------------------------------

        FOR i = 1 TO numcarriers
            IF carriers(i).Y = carriers(i).STOPPINGY THEN

                _FONT gamefontlrg

                DO
                    k2 = _KEYHIT

                    A$ = "YOU SURVIVED!"
                    LOCATE 8, 380: PRINT A$

                    B$ = "SCRAP COLLECTED: "
                    LOCATE 12, 340: PRINT B$; scrapcollected

                    C$ = "PLAY AGAIN?"
                    c = LEN(C$)
                    CX = (win.RIGHT / 2) - (c * c) 'lrgfontint)
                    LOCATE 16, CX: PRINT C$

                    D$ = "y / n"
                    D = LEN(D$)
                    DX = (win.RIGHT / 2) - (D * D) - 30 'lrgfontint)
                    LOCATE 17, DX: PRINT D$

                    IF k2 = 78 OR k2 = 110 THEN 'N
                        SYSTEM
                    END IF

                    IF k2 = 89 OR k2 = 121 THEN 'Y
                        basicsettings
                        setletters
                        GOTO 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

            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 '       - keeps background intact along with explosion
                movescrap
                scraphitdetect
                movefighters
                fightershots
                movecruisers
                cruisershots

                _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
                    PSET (player.X + time * pow * frag(i).vx, player.Y + time * pow * frag(i).vy), clr
                    randomcolors
                    PSET (player.X + time * pow * frag(i).vx, player.Y + rndm + time * pow * frag(i).vy), clr
                    randomcolors
                    PSET (player.X + rndm + time * pow * frag(i).vx, player.Y + time * pow * frag(i).vy), clr
                    randomcolors
                    PSET (player.X + rndm + time * pow * frag(i).vx, player.Y + rndm + time * pow * frag(i).vy), clr
                    randomcolors
                    PSET (player.X + rndm + time * pow * frag(i).vx, player.Y + time * pow * frag(i).vy), clr
                    randomcolors
                    PSET (player.X + rndm + time * pow * frag(i).vx, player.Y + rndm + time * pow * frag(i).vy), clr

                NEXT
                _LIMIT 60
            NEXT

        END IF

        player.X = -500 ' - remove fighter from screen so it doesn't collect scrap
        player.Y = -500

        DO
            movebackgroundscrap '       - keeps background intact along with explosion
            _PUTIMAGE (win.X, win.Y), planetrotation(irotation)
            movescrap
            scraphitdetect
            movefighters
            fightershots
            movecruisers
            cruisershots

            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
                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   -----------------------------

    escapekey

    _DISPLAY
    PCOPY 1, _DISPLAY

LOOP
OUTSIDELOOP:
CLEAR
GOTO RESTART:
'-------------------------------------------- ^^^ PRIMARY GAME LOOP ^^^ -----------------------------------------------
'=======================================================================================================================
'========================================   SUBS START HERE   ==========================================================
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB titlescreen '========================================================SUB TITLE SCREEN

    moveplayer ' - moveplayer sub modified for the title screen

    IF setlettersscriptran = 0 THEN
        setletters
    END IF

    FOR i = 1 TO lettersum
        _PUTIMAGE (lscrap(i).X, lscrap(i).Y), lscrap(i).PIC
    NEXT

    _FONT gamefontlrg
    LOCATE 4, 300: PRINT "40wattstudio presents"
    LOCATE 14, 300: PRINT "Use Arrow Keys to Select"
    LOCATE 15, 300: PRINT " Press ENTER to confirm"
    SELECT CASE menucase
        CASE 1
            LOCATE 18, 380: PRINT "START GAME"
            IF soundlevel <= 0 THEN
                LOCATE 19, 380: PRINT "sound level: <-- OFF -->"
            END IF
            IF soundlevel >= 10 THEN
                LOCATE 19, 380: PRINT "sound level: <-- max -->"
            END IF
            IF soundlevel >= 1 AND soundlevel < 10 THEN
                LOCATE 19, 380: PRINT "sound level: <-- "; soundlevel; " -->" ' multiplied by 10. divide by 10 before playing sound
            END IF
            LOCATE 20, 380: PRINT "CREDITS"
        CASE 3
            CLS
            clearletters
            credits
            menucase = 1
            setletters
    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 <= 545 THEN
                selector.Y = 545
            END IF
        END IF

        IF k3 = 20480 THEN '               - MOVE DOWN
            selector.Y = selector.Y + 30
            IF selector.Y >= 605 THEN
                selector.Y = 605
            END IF
        END IF

        IF (selector.Y = 545 AND _KEYDOWN(13)) OR _KEYDOWN(49) THEN 'start game if ENTER or 1
            clearletters
            loadlevel = 1
            levelinit = 1
            soundlevel = soundlevel / 10 ' - allows sound to play at proper volume level
        END IF

        IF selector.Y = 575 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 = 575 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

        IF selector.Y = 605 AND _KEYDOWN(13) THEN ' - go to credits screen if ENTER
            menucase = 3
        END IF

    END IF

END SUB
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB level1 '=============================================================SUB LEVEL 1

    IF scrapcollected < 2 THEN
        LOCATE 1, 400
        PRINT "COLLECT SCRAP"
    END IF

    movebackgroundscrap

    moveplayer

    movescrap

    scraphitdetect

    changeweapon

    IF weapontype = 1 THEN
        singlelaser
    END IF

    IF weapontype = 2 THEN
        rapidlaser
    END IF

    shothitdetection

    IF scrapcollected >= 4 OR _KEYDOWN(50) THEN '4
        loadlevel = 2
        levelinit = 2
    END IF

END SUB
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB level2 '============================================================SUB LEVEL 2

    movebackgroundscrap

    '_PUTIMAGE (200, 100), carrierunit
    '_PUTIMAGE (500, 500), bshipunit
    '_PUTIMAGE (200, 700), cruiserunit

    moveplayer

    movescrap

    scraphitdetect

    changeweapon

    IF weapontype = 1 THEN
        singlelaser
    END IF

    IF weapontype = 2 THEN
        rapidlaser
    END IF

    shothitdetection

    FOR i = 1 TO numfighters
        IF fighters(i).ACTIVE = 0 THEN
            resetfighters
        END IF
    NEXT
    movefighters
    fightershots

    FOR i = 1 TO numcruisers
        IF cruisers(i).ACTIVE = 0 THEN
            resetcruisers
        END IF
    NEXT
    movecruisers
    cruisershots

    IF shotdown = numall OR scrapcollected = numscrap THEN
        movecarriers
    END IF

    IF (cruisers(1).Y1 < cruisers(1).STOPPINGY) AND cruisers(1).Y1 <> -500 THEN
        _PUTIMAGE (0, 0), incomingtext
    END IF

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB freeimages '===========================================================SUB FREE IMAGES

    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 fighterpart1 < -1 THEN _FREEIMAGE fighterpart1
    IF fighterpart2 < -1 THEN _FREEIMAGE fighterpart2
    IF fpart1shotdown < -1 THEN _FREEIMAGE fpart1shotdown
    IF fpart2shotdown < -1 THEN _FREEIMAGE fpart2shotdown
    IF fighter1dmg1 < -1 THEN _FREEIMAGE fighter1dmg1
    IF fighter2dmg1 < -1 THEN _FREEIMAGE fighter2dmg1
    IF fighter2dmg2 < -1 THEN _FREEIMAGE fighter2dmg2
    IF fighter2dmg3 < -1 THEN _FREEIMAGE fighter2dmg3
    IF fighter2dmg4 < -1 THEN _FREEIMAGE fighter2dmg4
    IF cruiserunit < -1 THEN _FREEIMAGE cruiserunit
    IF rapidlaserpic < -1 THEN _FREEIMAGE rapidlaserpic

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB loadallgameassets '================================================SUB LOAD ALL GAME ASSETS

    '============================================================SOUNDS~~~1 SEC LOAD TIME

    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")
    levelsound = _SNDOPEN("SCRAPSHIP\x\sfx\musicdemomatthewpablo.wav", "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")

    soundlength = _SNDLEN(multilasersound)

    '===========================================================GRAPHICS~~~~NEGLIGIBLE LOADING TIME

    'statusbarpic = _LOADIMAGE("SCRAPSHIP\x\gfx\statusbar.png")
    selectorpic = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaPlayersmall.png")
    levelpic1 = _LOADIMAGE("SCRAPSHIP\x\gfx\eevee\0.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")
    fightershotpic = _LOADIMAGE("SCRAPSHIP\x\gfx\eshot10x20.png")
    cruisershotpic = _LOADIMAGE("SCRAPSHIP\x\gfx\emultishot_15x25.png")
    fighterpart1 = _LOADIMAGE("SCRAPSHIP\x\gfx\epart1of2_20x30.png")
    fighterpart2 = _LOADIMAGE("SCRAPSHIP\x\gfx\epart2of2_100x20.png")
    fpart1shotdown = _LOADIMAGE("SCRAPSHIP\x\gfx\epart1shotdown.png")
    fpart2shotdown = _LOADIMAGE("SCRAPSHIP\x\gfx\epart2shotdown.png")
    fighter1dmg1 = _LOADIMAGE("SCRAPSHIP\x\gfx\epart1dmg1.png")
    fighter2dmg1 = _LOADIMAGE("SCRAPSHIP\x\gfx\epart2dmg1.png")
    fighter2dmg2 = _LOADIMAGE("SCRAPSHIP\x\gfx\epart2dmg2.png")
    fighter2dmg3 = _LOADIMAGE("SCRAPSHIP\x\gfx\epart2dmg3.png")
    fighter2dmg4 = _LOADIMAGE("SCRAPSHIP\x\gfx\epart2dmg4.png")
    cruiserunit = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaCruiser.png")
    carrierunit = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaCarrier.png") 'LucaCarrierglowing.png")
    carriersideunit = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaCarriersideview.png")
    bshipunit = _LOADIMAGE("SCRAPSHIP\x\gfx\LucaBship.png")
    rapidlaserpic = _LOADIMAGE("SCRAPSHIP\x\gfx\multishot2.png")
    singlelaserpic = _LOADIMAGE("SCRAPSHIP\x\gfx\shot.png")
    incomingtext = _LOADIMAGE("SCRAPSHIP\x\gfx\incoming.png")
    gameovertext = _LOADIMAGE("SCRAPSHIP\x\gfx\gameover.png")
    creditsinsta = _LOADIMAGE("SCRAPSHIP\x\gfx\credits.png")

    FOR i = 1 TO bscrap '------------------------------------NEGLIGIBLE LOADING TIME
        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
        RANDOMIZE TIMER
        SELECT CASE i ' - cycle through all the foreground scrap and assign images
            CASE IS <= 4
                scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\30x30scrap1.png") 'scrap30x30.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 5 TO 8
                scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\45x45scrap1.png") 'scrap80x80.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 > 8
                scrap(i).PIC = _LOADIMAGE("SCRAPSHIP\x\gfx\55x55scrap1.png") 'scrap100x60.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

    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 + 3 'x for faster testing  3 for normal
    LOOP

    b = 0
    DO WHILE b < endblast '              - load explosion graphics
        blast$ = "SCRAPSHIP\x\gfx\exp" + LTRIM$(STR$(b)) + ".png"
        blastgif(b) = _LOADIMAGE(blast$)
        b = b + 1
    LOOP

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB basicsettings '==========================================================SUB BASIC SETTINGS

    CLS '                        - gets rid of printed text

    win.X = -100 '-800
    win.Y = 200 ' - 500
    win.MIDX = win.WIDTH / 2
    win.MIDY = win.HEIGHT / 2
    win.TOP = 30 '0
    win.BOTTOM = win.HEIGHT
    win.LEFT = 0
    win.RIGHT = win.WIDTH

    selector.X = 350
    selector.Y = 545

    menucase = 1

    player.WIDTH = 55
    player.HEIGHT = 52
    player.MIDX = player.WIDTH / 2
    player.MIDY = player.HEIGHT / 2
    player.X = win.MIDX - player.MIDX
    player.Y = (win.BOTTOM + win.MIDY) / 2 ' win.MIDY - player.MIDY
    player.HEALTH = 100
    player.SPEED = 5 '2 raise higher if game starts to LAG
    player.SCRAP = 0
    player.KILLED = 0

    voldown.HEIGHT = 200
    voldown.WIDTH = 200
    voldown.X = 100
    voldown.Y = 400
    voldown.SOUNDSPEED = 3
    voldown.VISIBLE = 1
    voldown.SETTINGSTOPY = 0
    voldown.ACTIVE = 1

    volup.HEIGHT = 200
    volup.WIDTH = 200
    volup.X = 600
    volup.Y = 400
    volup.SOUNDSPEED = 3
    volup.VISIBLE = 1
    volup.SETTINGSTOPY = 0
    volup.ACTIVE = 1

    enter.HEIGHT = 200
    enter.WIDTH = 200
    enter.X = 350
    enter.Y = 400

    '--------------------------------------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 = -200 '300
    NEXT

    FOR i = 1 TO numcruisers
        cruisers(i).WIDTH1 = 70
        cruisers(i).HEIGHT1 = 100
        cruisers(i).MIDX1 = cruisers(i).WIDTH1 / 2
        cruisers(i).MIDY1 = cruisers(i).HEIGHT1 / 2
        cruisers(i).X1 = INT(RND * (win.WIDTH - cruisers(i).WIDTH1))
        cruisers(i).Y1 = INT(RND * win.HEIGHT - cruisers(i).HEIGHT1) * -1
        cruisers(i).HEALTH1 = 200
        cruisers(i).KILLED1 = 0
        cruisers(i).VISIBLE1 = 0
        cruisers(i).STOPPED = 0
        cruisers(i).STOPPINGY = INT(RND * (win.MIDY - cruisers(i).HEIGHT1)) + cruisers(i).HEIGHT1 'win.midy - 100) + 200 ' + 100
        cruisers(i).CRUISERSPEED = INT(RND * 2) + 1
        cruisers(i).ACTIVE = 0
        cruisers(i).DISTANCEX = 0
        cruisers(i).ODDSOFACTIVE = 0
        cruisers(i).PLAYERPOSITION = 3
        cruisers(i).PLAYERABOVE = 3
    NEXT

    FOR i = 1 TO numfighters
        fighters(i).WIDTH1 = 20
        fighters(i).WIDTH2 = 100
        fighters(i).HEIGHT1 = 30
        fighters(i).HEIGHT2 = 20
        fighters(i).X2 = INT(RND * (win.WIDTH - fighters(i).WIDTH2)) ' easier to calculate from widest segment first
        fighters(i).X1 = fighters(i).X2 + 40 '     - x1 relative to x2
        fighters(i).Y1 = INT(RND * win.HEIGHT - 50) * -1 'random gen y1
        fighters(i).REFY = fighters(i).Y1
        fighters(i).Y2 = fighters(i).REFY - 20 'make y2 relative to y1
        fighters(i).MIDX1 = (fighters(i).X1 + fighters(i).WIDTH1) / 2
        fighters(i).HEALTH1 = 20
        fighters(i).HEALTH2 = 50
        fighters(i).HEALTHTOTAL = fighters(i).HEALTH1 + fighters(i).HEALTH2
        fighters(i).KILLED1 = 0
        fighters(i).KILLED2 = 0
        fighters(i).VISIBLE1 = 0
        fighters(i).FIGHTERSPEED = INT(RND * 3) + 2
        fighters(i).ACTIVE = 0
        fighters(i).DISTANCE = 0
        fighters(i).ODDSOFACTIVE = 0
        fighters(i).PLAYERPOSITION = 3
    NEXT

    '-------------------------------------SCRIPT DATA

    foregroundscrapscriptran = 0
    backgroundscrapscriptran = 0
    lasershotscriptran = 0
    multishotscriptran = 0
    cruiserstopscriptran = 0
    rotationscript = 0
    setletterscriptran = 0
    healthscriptran = 0

    '-------------------------------------OTHER DATA
    soundlevel = 0.5
    soundlevel = soundlevel * 10
    sounddelay = 0
    scrapcollected = 0
    loadlevel = 0
    issoundon = 1
    isaudioon = 0
    playermovingleft = 0
    playermovingright = 0
    shotdown = 0
    iterations = 0
    weapontype = 1 ' single laser
    endcredits = 0

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB randomcolors '===================================================SUB RANDOM COLORS

    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
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB setletters '=====================================================SUB SET LETTERS

    FOR i = 1 TO lettersum

        RANDOMIZE TIMER

        path$ = "SCRAPSHIP\x\gfx\" + LTRIM$(STR$(i)) + ".png"
        lscrap(i).PIC = _LOADIMAGE(path$)
        lscrap(i).WIDTH = 80
        lscrap(i).HEIGHT = 80
        IF i = 1 THEN
            lscrap(i).X = 800 '0
        END IF
        IF i <> 1 THEN
            lscrap(i).X = lscrap(i - 1).X - lscrap(i).WIDTH
        END IF
        lscrap(i).Y = INT(RND * 50) + 150

    NEXT

    setlettersscriptran = 1

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB clearletters '============================================================SUB CLEAR LETTERS

    FOR i = 1 TO lettersum

        lscrap(i).X = -500
        lscrap(i).Y = -500

    NEXT

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB resetcruisers '====================================================SUB RESET CRUISERS

    FOR i = 1 TO numcruisers

        IF cruisers(i).KILLED1 = 0 AND cruisers(i).ACTIVE = 0 THEN 'cruisers(i).ACTIVE = 0 AND cruisers(i).KILLED1 = 0 THEN 'KILLED1 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).X1 + cruisers(i).MIDX1 'shot origin
            cshot(i).Y = cruisers(i).Y1 + cruisers(i).MIDY1 'shot origin
            cshot(i).DAMAGE = 15
            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
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB resetfighters '===============================================SUB RANDOM ACTIVE FIGHTERS

    FOR i = 1 TO numfighters

        IF fighters(i).ACTIVE = 0 AND fighters(i).KILLED1 = 0 THEN
            RANDOMIZE TIMER
            fshot(i).SPEED = INT(RND * 2) + fighters(i).FIGHTERSPEED + 2
            fshot(i).HEIGHT = 10
            fshot(i).WIDTH = 20
            fshot(i).X = fighters(i).X1
            fshot(i).Y = fighters(i).Y1 + fighters(i).HEIGHT1
            fshot(i).RANGE = fshot(i).Y + win.BOTTOM 'full screen range
            fshot(i).DAMAGE = INT(RND * 15) + 5
            fighters(i).DISTANCE = 0
            fighters(i).ODDSOFACTIVE = 0
            fighters(i).PLAYERPOSITION = 3
        END IF

    NEXT

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB cruisershots '=======================================================SUB CRUISER SHOTS

    FOR i = 1 TO numcruisers

        IF cruisers(i).ACTIVE = 0 AND cruisers(i).VISIBLE1 = 1 THEN ' - if cruisers not active but visible
            RANDOMIZE TIMER

            cruisers(i).DISTANCEX = (cruisers(i).X1 + cruisers(i).MIDX1) - player.X ' - calculate distance to player on x

            IF cruisers(i).DISTANCEX < 0 THEN
                cruisers(i).DISTANCEX = cruisers(i).DISTANCEX * -1 ' - make x distance positive
            END IF

            cruisers(i).DISTANCEY = (cruisers(i).Y1 + cruisers(i).MIDY1) - player.Y '  - calculate distance to player on y

            IF cruisers(i).DISTANCEY < 0 THEN
                cruisers(i).DISTANCEY = cruisers(i).DISTANCEY * -1 ' - make y distance positive
            END IF

            IF cruisers(i).Y1 + cruisers(i).MIDY1 < player.Y THEN ' - if middle of cruiser is above player
                cruisers(i).PLAYERABOVE = 1
            END IF

            IF cruisers(i).Y1 + cruisers(i).MIDY1 >= player.Y THEN ' - if middle of cruiser is below player
                cruisers(i).PLAYERABOVE = 0
            END IF

            cruisers(i).ODDSOFACTIVE = INT(RND * cruisers(i).DISTANCEX) + 1 ' - pick random number based on x distance WHAT ABOUT Y?

            IF cruisers(i).X1 + cruisers(i).MIDX1 < player.X THEN 'if player is idle right of cruiser  'TEST
                IF cruisers(i).ODDSOFACTIVE < 20 THEN
                    cruisers(i).ACTIVE = 1
                    cruisers(i).PLAYERPOSITION = 1
                END IF
            END IF

            IF cruisers(i).X1 + cruisers(i).MIDX1 >= player.X THEN 'if player is idle left of cruiser  'TEST
                IF cruisers(i).ODDSOFACTIVE < 20 THEN
                    cruisers(i).ACTIVE = 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).ACTIVE = 1 AND cruisers(i).VISIBLE1 THEN

            IF cruisers(i).PLAYERABOVE = 0 THEN ' TEST if player is above cruiser????
                cshot(i).Y = (cshot(i).Y - cruisers(i).DISTANCEY) ' - cruisers(i).height1
            END IF

            IF cruisers(i).PLAYERABOVE = 1 THEN
                cshot(i).Y = (cshot(i).Y + cruisers(i).DISTANCEY) '+ cshot(i).SPEED
            END IF

            IF cruisers(i).PLAYERPOSITION = 1 THEN
                cshot(i).X = (cshot(i).X + cruisers(i).DISTANCEX) '+ cshot(i).SPEED
            END IF

            IF cruisers(i).PLAYERPOSITION = 2 THEN
                cshot(i).X = (cshot(i).X - cruisers(i).DISTANCEX) '- cshot(i).SPEED
            END IF

            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).ACTIVE = 0
                cshot(i).X = -500
                cshot(i).Y = -500
            END IF

            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 - cshot(i).DAMAGE

                cruisers(i).ACTIVE = 0
                cshot(i).X = -500
                cshot(i).Y = -500
            END IF

            IF cruisers(i).ACTIVE = 1 THEN ' - if you comment this out, shots will stay centered on the cruisers.
                _PUTIMAGE (cshot(i).X, cshot(i).Y), cruisershotpic
            END IF

        END IF

    NEXT

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB fightershots '======================================================= SUB FIGHTER SHOTS

    '--------------------------------------------FIGHTERS
    FOR i = 1 TO numfighters

        IF fighters(i).ACTIVE = 0 THEN
            RANDOMIZE TIMER
            fighters(i).DISTANCE = fighters(i).X1 - player.X
            IF fighters(i).DISTANCE < 0 THEN
                fighters(i).DISTANCE = fighters(i).DISTANCE * -1 'make distance positive
            END IF
            fighters(i).ODDSOFACTIVE = INT(RND * fighters(i).DISTANCE) + 1

            IF (fighters(i).X1 + fighters(i).WIDTH1) < player.X THEN
                IF fighters(i).ODDSOFACTIVE < 50 THEN '50
                    fighters(i).ACTIVE = 1
                END IF
            END IF

            IF fighters(i).X1 > player.X THEN
                IF fighters(i).ODDSOFACTIVE < 50 THEN
                    fighters(i).ACTIVE = 1
                END IF
            END IF
        END IF

    NEXT

    '---------------------------------FIGHTERS

    FOR i = 1 TO numfighters

        IF fighters(i).ACTIVE = 1 AND fighters(i).KILLED1 = 0 THEN 'if fighter is active and not shot down

            fshot(i).Y = fshot(i).Y + fshot(i).SPEED '             - calculate shot speed

            IF fshot(i).Y >= fshot(i).RANGE THEN '                 - if shot out of range
                fighters(i).ACTIVE = 0 '                           - shot is inactive, allows for reset for next shot
            END IF

            IF (player.X + player.WIDTH >= fshot(i).X) AND (player.X <= fshot(i).X + fshot(i).WIDTH) AND (player.Y <= fshot(i).Y + fshot(i).HEIGHT) AND (player.Y + player.HEIGHT >= fshot(i).Y) THEN

                player.HEALTH = player.HEALTH - fshot(i).DAMAGE '  - calculate new player health

                fighters(i).ACTIVE = 0 '                           - deactivate shot
            END IF

            IF fighters(i).ACTIVE = 1 THEN '                       - if shot is active
                _PUTIMAGE (fshot(i).X, fshot(i).Y), fightershotpic ' - draw shot pic
            END IF

            'IF issoundon = 1 THEN 'TEST
            '    _SNDVOL sethlaser, soundlevel
            '    IF sethlaser THEN _SNDPLAYCOPY sethlaser
            'END IF



        END IF

    NEXT

END SUB
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB shothitdetection '==================================================== SUB SHOT HIT DETECTION

    '-------------------------   MULTI SHOT HIT DETECTION   ---------------------
    numshots = 0
    DO
        IF xshot(numshots).ACTIVE THEN
            xshot(numshots).SPEED = 10 '5
            xshot(numshots).HEIGHT = 20
            xshot(numshots).WIDTH = 10
            xshot(numshots).MIDX = xshot(numshots).WIDTH / 2
            xshot(numshots).Y = xshot(numshots).Y - xshot(numshots).SPEED '-5
            xshot(numshots).DAMAGE = 10
            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), rapidlaserpic
            END IF
        END IF

        FOR i = 1 TO numfighters '  - while numshot DO LOOP running, checks all fighters for hits

            '-------------------------------------------FIGHTERS
            '---------------- FIRST SEGMENT

            IF (fighters(i).VISIBLE1 = 1) AND (fighters(i).KILLED1) = 0 AND (xshot(numshots).X + xshot(numshots).WIDTH >= fighters(i).X1) AND (xshot(numshots).X <= fighters(i).X1 + fighters(i).WIDTH1) AND (xshot(numshots).Y <= fighters(i).Y1 + fighters(i).HEIGHT1) AND (xshot(numshots).Y + xshot(numshots).HEIGHT >= fighters(i).Y1) THEN
                fighters(i).HEALTH1 = fighters(i).HEALTH1 - xshot(numshots).DAMAGE
                fighters(i).HEALTHTOTAL = fighters(i).HEALTHTOTAL - xshot(numshots).DAMAGE
                blastnum = 1
                DO WHILE blastnum < endblast
                    _PUTIMAGE (INT(RND * fighters(i).WIDTH1) + fighters(i).X1, INT(RND * fighters(i).HEIGHT1) + fighters(i).Y1), blastgif(blastnum) ' - place random blasts on the cruiser
                    blastnum = blastnum + 1
                LOOP
                IF fighters(i).HEALTH1 = 10 THEN
                    _PUTIMAGE (fighters(i).X1, fighters(i).Y1), fighter1dmg1
                END IF
                xshot(numshots).X = -500 'KEEP
                xshot(numshots).Y = -500 'KEEP
                xshot(numshots).ACTIVE = FALSE
                IF fighters(i).HEALTH1 <= 0 THEN
                    fighters(i).KILLED1 = 1
                    fighters(i).X1 = -500
                    fighters(i).Y1 = -500
                    IF fighters(i).KILLED2 = 1 THEN
                        shotdown = shotdown + 1
                    END IF
                END IF
            END IF

            '-------------- SECOND SEGMENT

            IF (fighters(i).VISIBLE2 = 1) AND (fighters(i).KILLED2) = 0 AND (xshot(numshots).X + xshot(numshots).WIDTH >= fighters(i).X2) AND (xshot(numshots).X <= fighters(i).X2 + fighters(i).WIDTH2) AND (xshot(numshots).Y <= fighters(i).Y2 + fighters(i).HEIGHT2) AND (xshot(numshots).Y + xshot(numshots).HEIGHT >= fighters(i).Y2) THEN
                fighters(i).HEALTH2 = fighters(i).HEALTH2 - xshot(numshots).DAMAGE
                fighters(i).HEALTHTOTAL = fighters(i).HEALTHTOTAL - xshot(numshots).DAMAGE
                blastnum = 1
                DO WHILE blastnum < endblast
                    _PUTIMAGE (INT(RND * fighters(i).WIDTH2) + fighters(i).X2, INT(RND * fighters(i).HEIGHT2) + fighters(i).Y2), blastgif(blastnum) ' - place random blasts on the cruiser
                    blastnum = blastnum + 1
                LOOP
                xshot(numshots).X = -500 'KEEP
                xshot(numshots).Y = -500 'KEEP
                xshot(numshots).ACTIVE = FALSE

                IF fighters(i).HEALTH2 = 40 THEN
                    _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighter2dmg1
                END IF

                IF fighters(i).HEALTH2 = 30 THEN
                    _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighter2dmg2
                END IF

                IF fighters(i).HEALTH2 = 20 THEN
                    _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighter2dmg3
                END IF

                IF fighters(i).HEALTH2 = 10 THEN
                    _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighter2dmg4
                END IF

                IF fighters(i).HEALTH2 <= 0 THEN
                    fighters(i).KILLED2 = 1
                    fighters(i).X2 = -500 'remove fighter coordinates so you don't crash into it
                    fighters(i).Y2 = -500
                    IF fighters(i).KILLED1 = 1 THEN
                        shotdown = shotdown + 1
                    END IF
                END IF
            END IF

        NEXT

        '---------------------------------------------CRUISERS

        FOR i = 1 TO numcruisers

            IF (cruisers(i).VISIBLE1 = 1) AND (cruisers(i).KILLED1) = 0 AND (xshot(numshots).X + xshot(numshots).WIDTH >= cruisers(i).X1) AND (xshot(numshots).X <= cruisers(i).X1 + cruisers(i).WIDTH1) AND (xshot(numshots).Y <= cruisers(i).Y1 + cruisers(i).HEIGHT1) AND (xshot(numshots).Y + xshot(numshots).HEIGHT >= cruisers(i).Y1) THEN
                cruisers(i).HEALTH1 = cruisers(i).HEALTH1 - xshot(numshots).DAMAGE
                blastnum = 1
                DO WHILE blastnum < endblast
                    _PUTIMAGE (INT(RND * cruisers(i).WIDTH1) + cruisers(i).X1, INT(RND * cruisers(i).HEIGHT1) + cruisers(i).Y1), blastgif(blastnum) ' - place random blasts on the cruiser
                    blastnum = blastnum + 1
                LOOP
                ' _PUTIMAGE (cruisers(i).X1, cruisers(i).Y1), fighter1dmg1
                xshot(numshots).X = -500 'KEEP
                xshot(numshots).Y = -500 'KEEP
                xshot(numshots).ACTIVE = FALSE
                IF cruisers(i).HEALTH1 <= 0 THEN
                    cruisers(i).KILLED1 = 1
                    cruisers(i).X1 = -500
                    cruisers(i).Y1 = -500
                    shotdown = shotdown + 1
                END IF
            END IF

        NEXT
        numshots = numshots + 1
    LOOP UNTIL numshots = maxshots

    multishotscriptran = 0

    '----------------------------   SINGLE SHOT HIT DETECTION   --------

    FOR i = 1 TO numfighters

        '------------------------------------------------------FIGHTERS

        IF (fighters(i).VISIBLE1 = 1) AND (fighters(i).KILLED1) = 0 AND (oneshot.X + oneshot.WIDTH >= fighters(i).X1) AND (oneshot.X <= fighters(i).X1 + fighters(i).WIDTH1) AND (oneshot.Y <= fighters(i).Y1 + fighters(i).HEIGHT1) AND (oneshot.Y + oneshot.HEIGHT >= fighters(i).Y1) THEN
            fighters(i).HEALTH1 = fighters(i).HEALTH1 - oneshot.DAMAGE
            fighters(i).HEALTHTOTAL = fighters(i).HEALTHTOTAL - oneshot.DAMAGE
            blastnum = 1
            DO WHILE blastnum < endblast - 2 ' -2 for shorter animation
                _PUTIMAGE (INT(RND * fighters(i).WIDTH1) + fighters(i).X1, INT(RND * fighters(i).HEIGHT1) + fighters(i).Y1), blastgif(blastnum) ' - place random blasts on the cruiser
                blastnum = blastnum + 1
            LOOP
            '_PUTIMAGE (fighters(i).X1, fighters(i).Y1), fighter1dmg1
            lasershotscriptran = 0 'resets the shot because it hit
            oneshot.X = -500 ' - move coordinates off screen so hits are no longer detected
            oneshot.Y = -500 '
            IF fighters(i).HEALTH1 <= 0 THEN
                fighters(i).KILLED1 = 1
                fighters(i).X1 = -500
                fighters(i).Y1 = -500
                IF fighters(i).KILLED2 = 1 THEN
                    shotdown = shotdown + 1
                END IF
            END IF
        END IF

        IF (fighters(i).VISIBLE2 = 1) AND (fighters(i).KILLED2) = 0 AND (oneshot.X + oneshot.WIDTH >= fighters(i).X2) AND (oneshot.X <= fighters(i).X2 + fighters(i).WIDTH2) AND (oneshot.Y <= fighters(i).Y2 + fighters(i).HEIGHT2) AND (oneshot.Y + oneshot.HEIGHT >= fighters(i).Y2) THEN
            fighters(i).HEALTH2 = fighters(i).HEALTH2 - oneshot.DAMAGE
            blastnum = 1
            DO WHILE blastnum < endblast - 2 ' -2 for shorter animation
                _PUTIMAGE (INT(RND * fighters(i).WIDTH2) + fighters(i).X2, INT(RND * fighters(i).HEIGHT2) + fighters(i).Y2), blastgif(blastnum) ' - place random blasts on the cruiser
                blastnum = blastnum + 1
            LOOP
            oneshot.X = -500
            oneshot.Y = -500
            IF fighters(i).HEALTH2 = 40 THEN
                _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighter2dmg1
            END IF
            IF fighters(i).HEALTH2 = 30 THEN
                _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighter2dmg2
            END IF
            IF fighters(i).HEALTH2 = 20 THEN
                _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighter2dmg3
            END IF
            IF fighters(i).HEALTH2 = 10 THEN
                _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighter2dmg4
            END IF

            lasershotscriptran = 0
            IF fighters(i).HEALTH2 <= 0 THEN
                fighters(i).KILLED2 = 1
                fighters(i).X2 = -500 'remove fighter coordinates so you don't crash into it
                fighters(i).Y2 = -500

                IF fighters(i).KILLED1 = 1 THEN
                    shotdown = shotdown + 1
                END IF
            END IF
        END IF

    NEXT

    '----------------------------------------------------------CRUISERS

    FOR i = 1 TO numcruisers

        IF (cruisers(i).VISIBLE1 = 1) AND (cruisers(i).KILLED1) = 0 AND (oneshot.X + oneshot.WIDTH >= cruisers(i).X1) AND (oneshot.X <= cruisers(i).X1 + cruisers(i).WIDTH1) AND (oneshot.Y <= cruisers(i).Y1 + cruisers(i).HEIGHT1) AND (oneshot.Y + oneshot.HEIGHT >= cruisers(i).Y1) THEN
            cruisers(i).HEALTH1 = cruisers(i).HEALTH1 - oneshot.DAMAGE
            blastnum = 1
            DO WHILE blastnum < endblast
                _PUTIMAGE (INT(RND * cruisers(i).WIDTH1) + cruisers(i).X1, INT(RND * cruisers(i).HEIGHT1) + cruisers(i).Y1), blastgif(blastnum) ' - place random blasts on the cruiser
                blastnum = blastnum + 1
            LOOP
            ' _PUTIMAGE (fighters(i).X1, fighters(i).Y1), fighter1dmg1
            lasershotscriptran = 0 'resets the shot because it hit
            oneshot.X = -500
            oneshot.Y = -500
            IF cruisers(i).HEALTH1 <= 0 THEN
                cruisers(i).KILLED1 = 1
                cruisers(i).X1 = -500
                cruisers(i).Y1 = -500
                shotdown = shotdown + 1
            END IF
        END IF

    NEXT

    IF (oneshot.Y + oneshot.HEIGHT) <= oneshot.RANGE THEN 'shot has range of half screen height
        lasershotscriptran = 0 'allows reset for another shot
        oneshot.X = -500
        oneshot.Y = -500
    END IF

    IF lasershotscriptran = 1 THEN
        oneshot.Y = (oneshot.Y - oneshot.SPEED)

        _PUTIMAGE (oneshot.X, oneshot.Y), singlelaserpic
    END IF

END SUB
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB movecarriers '==============================================================SUB MOVE CARRIERS
    FOR i = 1 TO numcarriers
        _LIMIT 45
        carriers(i).Y = carriers(i).Y + 1
        IF carriers(i).Y = carriers(i).STOPPINGY THEN
            carriers(i).Y = -200
        END IF
        _PUTIMAGE (carriers(i).X, carriers(i).Y), carrierunit
    NEXT
END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB movecruisers '===============================================================SUB MOVE CRUISERS

    FOR i = 1 TO numcruisers
        RANDOMIZE TIMER

        IF cruisers(i).KILLED1 = 0 AND cruisers(i).STOPPED = 0 THEN ' - if cruiser not shot down and hasn't stopped

            cruisers(i).Y1 = cruisers(i).Y1 + cruisers(i).CRUISERSPEED

            IF cruisers(i).Y1 + cruisers(i).MIDY1 >= 0 THEN ' - if half of cruiser is visible
                cruisers(i).VISIBLE1 = 1
            END IF

            IF cruisers(i).Y1 >= cruisers(i).STOPPINGY THEN ' - if cruiser reaches stopping point
                cruisers(i).STOPPED = 1
            END IF

        END IF

        _PUTIMAGE (cruisers(i).X1, cruisers(i).Y1), cruiserunit

    NEXT

END SUB
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB movefighters '======================================================================SUB MOVE FIGHTERS

    FOR i = 1 TO numfighters '                          - determine player position relative to enemy

        IF fighters(i).ACTIVE = 0 THEN 'necessary???

            IF (fighters(i).X1 + fighters(i).MIDX1) AND (fighters(i).X2 + 50) < player.X + player.MIDX THEN
                fighters(i).PLAYERPOSITION = 2 ' player to the right
            END IF

            IF (fighters(i).X1 + fighters(i).MIDX1) AND (fighters(i).X2 + 50) > player.X + player.MIDX THEN
                fighters(i).PLAYERPOSITION = 1 'player to the left
            END IF

            IF (fighters(i).X1 + fighters(i).MIDX1) AND (fighters(i).X2 + 50) = player.X + player.MIDX THEN
                IF player.X + player.MIDX > 500 THEN
                    fighters(i).PLAYERPOSITION = 2 'player to the right
                END IF

                IF player.X + player.MIDX <= 500 THEN
                    fighters(i).PLAYERPOSITION = 1 'player to the left
                END IF
            END IF

        END IF

        '----------------------------------------- FIRST SEGMENT (COCKPIT) ------------------------------------------------------

        IF fighters(i).KILLED1 = 0 THEN

            fighters(i).Y1 = fighters(i).Y1 + fighters(i).FIGHTERSPEED '      - calculate fighter movement on y
            fighters(i).REFY = fighters(i).REFY + fighters(i).FIGHTERSPEED '  - calculate reference movement on y

            IF fighters(i).PLAYERPOSITION = 1 THEN '                        - if player is left of fighter

                IF _KEYDOWN(32) THEN
                    fighters(i).X1 = fighters(i).X1 + 2

                    IF fighters(i).X1 + fighters(i).WIDTH1 + 40 >= win.RIGHT THEN '- keep segment1 from going off screen on x ...
                        fighters(i).X1 = win.RIGHT - (fighters(i).WIDTH1 - 40) '     - ... use + 40 to compensate for segment2
                    END IF

                END IF

                fighters(i).X1 = fighters(i).X1 - 1 '                         - calculate fighter chase on x

                IF fighters(i).X1 - 40 <= win.LEFT THEN '                      - keeps segment1 from going off screen on x ...
                    fighters(i).X1 = win.LEFT + 40 '                           - ... use -40 to compensate for segment2
                END IF

            END IF

            IF fighters(i).PLAYERPOSITION = 2 THEN '                          - if player is right of fighter

                IF _KEYDOWN(32) THEN
                    fighters(i).X1 = fighters(i).X1 - 2

                    IF fighters(i).X1 - 40 <= win.LEFT THEN '                      - keeps segment1 from going off screen on x ...
                        fighters(i).X1 = win.LEFT + 40 '                           - ... use -40 to compensate for segment2
                    END IF

                END IF


                fighters(i).X1 = fighters(i).X1 + 1 '                         - calculate fighter chase on x

                IF fighters(i).X1 + fighters(i).WIDTH1 + 40 >= win.RIGHT THEN '- keep segment1 from going off screen on x ...
                    fighters(i).X1 = win.RIGHT - (fighters(i).WIDTH1 - 40) '     - ... use + 40 to compensate for segment2
                END IF

            END IF

            IF fighters(i).Y1 AND fighters(i).REFY >= 0 THEN
                fighters(i).VISIBLE1 = 1
            END IF

        END IF

        '-------------------------------------------------- SECOND SEGMENT (WINGS) ---------------------------------------

        IF fighters(i).KILLED2 = 0 THEN

            fighters(i).Y2 = fighters(i).Y2 + fighters(i).FIGHTERSPEED

            IF fighters(i).PLAYERPOSITION = 1 THEN 'left

                IF _KEYDOWN(32) THEN '                                    - enemy ship dodges player fire.
                    fighters(i).X2 = fighters(i).X2 + 2

                    IF fighters(i).X2 + fighters(i).WIDTH2 >= win.RIGHT THEN 'keep fighter from going off screen right
                        fighters(i).X2 = win.RIGHT - fighters(i).WIDTH2
                        fighters(i).X1 = win.RIGHT - fighters(i).WIDTH1 - 40
                    END IF

                END IF

                fighters(i).X2 = fighters(i).X2 - 1

                IF fighters(i).X2 <= win.LEFT THEN 'keep fighter from going off screen left
                    fighters(i).X2 = win.LEFT
                END IF

            END IF

            IF fighters(i).PLAYERPOSITION = 2 THEN 'right

                IF _KEYDOWN(32) THEN
                    fighters(i).X2 = fighters(i).X2 - 2

                    IF fighters(i).X2 <= win.LEFT THEN 'keep fighter from going off screen left
                        fighters(i).X2 = win.LEFT
                    END IF

                END IF

                fighters(i).X2 = fighters(i).X2 + 1

                IF fighters(i).X2 + fighters(i).WIDTH2 >= win.RIGHT THEN 'keep fighter from going off screen right
                    fighters(i).X2 = win.RIGHT - fighters(i).WIDTH2
                    fighters(i).X1 = win.RIGHT - fighters(i).WIDTH1 - 40
                END IF

            END IF

            IF fighters(i).Y2 >= 0 THEN
                fighters(i).VISIBLE2 = 1
            END IF

        END IF

        RANDOMIZE TIMER

        '------------------------- FIGHTER LOOP CONDITIONS -------------------------

        IF fighters(i).Y1 >= win.BOTTOM AND fighters(i).KILLED2 = 1 THEN '     - if only the first segment survives to screen bottom
            fighters(i).KILLED1 = 1
            fighters(i).X1 = -500
            fighters(i).Y1 = -500
            fighters(i).X2 = -500
            fighters(i).Y2 = -500
            shotdown = shotdown + 1
        END IF

        IF fighters(i).Y2 >= win.BOTTOM AND fighters(i).KILLED1 = 1 THEN '      - if only the second segment survives to screen bottom
            fighters(i).KILLED2 = 1
            fighters(i).X2 = -500
            fighters(i).Y2 = -500
            fighters(i).X1 = -500
            fighters(i).Y1 = -500
            shotdown = shotdown + 1
        END IF

        IF fighters(i).Y2 >= win.BOTTOM AND fighters(i).KILLED1 = 0 THEN '      - if both segments survive to screen bottom
            fighters(i).X2 = INT(RND * (win.WIDTH - fighters(i).WIDTH2))
            fighters(i).X1 = fighters(i).X2 + 40 '     - x1 relative to x2
            fighters(i).Y1 = INT(RND * win.HEIGHT - 50) * -1 'random gen y1
            fighters(i).REFY = fighters(i).Y1
            fighters(i).Y2 = fighters(i).REFY - 20 'make y2 relative to y1
        END IF

        '--------------------------------------------- DRAW SEGMENT 1 BASED ON DAMAGE

        IF fighters(i).HEALTH1 > 10 THEN
            _PUTIMAGE (fighters(i).X1, fighters(i).Y1), fighterpart1
        END IF

        IF fighters(i).HEALTH1 = 10 THEN
            _PUTIMAGE (fighters(i).X1, fighters(i).Y1), fighter1dmg1
        END IF

        '---------------------------------------------- DRAW SEGMENT 2 BASED ON DAMAGE ------------------

        IF fighters(i).HEALTH2 = 40 THEN
            _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighter2dmg1
        END IF

        IF fighters(i).HEALTH2 = 30 THEN
            _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighter2dmg2
        END IF

        IF fighters(i).HEALTH2 = 20 THEN
            _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighter2dmg3
        END IF

        IF fighters(i).HEALTH2 = 10 THEN
            _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighter2dmg4
        END IF

        IF fighters(i).HEALTH2 > 40 THEN
            _PUTIMAGE (fighters(i).X2, fighters(i).Y2), fighterpart2
        END IF

    NEXT

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB rapidlaser '====================================================================SUB MULTI SHOT

    IF _KEYDOWN(32) AND keydelay = 0 AND sounddelay <= 0 THEN
        RANDOMIZE TIMER
        IF issoundon = 1 AND TIMER + soundlength > soundtimer THEN 'slow sounding. has pauses between bursts
            soundtimer = TIMER + soundlength
            _SNDVOL multilasersound, soundlevel
            _SNDPLAYCOPY multilasersound
            sounddelay = 3 '2 ok but 3 better

        END IF

        numshots = 0
        DO
            IF NOT xshot(numshots).ACTIVE THEN ' if no shots are active???
                xshot(numshots).ACTIVE = TRUE
                xshot(numshots).X = player.X + player.MIDX - xshot(numshots).MIDX
                xshot(numshots).Y = player.Y
                keydelay = 5 ' changing this value changes rate of fire   10 = single
                EXIT DO
            END IF
            numshots = numshots + 1

        LOOP UNTIL numshots = maxshots

    END IF
    IF keydelay THEN keydelay = keydelay - 1
    multishotscriptran = 1 'KEEP THIS ONE HERE
    IF sounddelay THEN
        sounddelay = sounddelay - 1
    END IF

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB singlelaser '============================================================SUB FIRE SHOT

    IF _KEYDOWN(32) AND lasershotscriptran = 0 THEN
        IF issoundon = 1 THEN
            _SNDVOL singlelasersound, soundlevel
            IF singlelasersound THEN _SNDPLAYCOPY singlelasersound
        END IF
        oneshot.SPEED = 10
        oneshot.HEIGHT = 20
        oneshot.WIDTH = 10
        oneshot.MIDX = oneshot.WIDTH / 2
        oneshot.X = player.X + player.MIDX - oneshot.MIDX
        oneshot.Y = player.Y
        oneshot.DAMAGE = 50
        oneshot.RANGE = oneshot.Y - win.MIDY 'range relative to player position - half window length  ' - WIN.BOTTOM FOR FULL LENGTH SHOT
        lasershotscriptran = 1
    END IF

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB moveplayer '===========================================================SUB MOVE PLAYER

    IF loadlevel > 0 THEN

        playermovingleft = 0
        playermovingright = 0

        IF _KEYDOWN(CVI(CHR$(0) + "K")) AND player.X > win.LEFT THEN '    - MOVE LEFT
            player.X = player.X - player.SPEED
            win.X = win.X + 1
            playermovingleft = 1
        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
            playermovingright = 1
        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 '-
        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 '+
        END IF

    END IF

    IF rotationscript = 0 THEN
        irotation = 1
        rotationscript = 1
    END IF

    IF loadlevel < 3 THEN
        IF iterations = 200 THEN
            win.Y = win.Y - 1
            irotation = irotation + 3 '20 for faster testing   2 for normal
            IF irotation >= maxrotation THEN irotation = 1
            iterations = 0
        END IF
        _PUTIMAGE (win.X, win.Y), planetrotation(irotation)
        iterations = iterations + 1
    END IF

    IF loadlevel > 0 THEN

        SELECT CASE player.HEALTH

            CASE IS > 80
                _PUTIMAGE (player.X, player.Y), player.PIC
            CASE 66 TO 80
                _PUTIMAGE (player.X, player.Y), playerdmg1
            CASE 51 TO 65
                _PUTIMAGE (player.X, player.Y), playerdmg2
            CASE 36 TO 50
                _PUTIMAGE (player.X, player.Y), playerdmg3
            CASE 21 TO 35
                _PUTIMAGE (player.X, player.Y), playerdmg4
            CASE IS < 20
                _PUTIMAGE (player.X, player.Y), playerdmg5

        END SELECT

    END IF

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB moveboss1 '==========================================================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
    END IF

    IF move < 10 THEN
        boss1.X = boss1.X - 1
    END IF
    _PUTIMAGE (boss1.X, boss1.Y), boss1.PIC

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB randomboss1 '==============================================================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
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB boss1hitdetect '====================================================SUB BOSS 1 HIT DETECT

    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
        CLS
        LOCATE 1, 1: PRINT "GAME OVER MAN, GAME OVER!"
        END
    END IF

END SUB
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB scraphitdetect '==============================================================SUB SCRAP HIT DETECT

    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 movescrap '=====================================================================SUB MOVE SCRAP

    FOR i = 1 TO numscrap

        IF scrap(i).COLLECTED = 0 THEN
            RANDOMIZE TIMER
            move = INT(RND * RND * 100) + 1

            IF move < 10 THEN ' - move scrap right
                scrap(i).X = scrap(i).X + 1
            END IF
            IF move < 5 AND scrap(i).X < win.MIDX THEN '   - move scrap down on left side of screen
                scrap(i).Y = scrap(i).Y + 1
            END IF

            IF move < 5 AND scrap(i).X > win.MIDX THEN '   - move scrap up on right side of screen
                scrap(i).Y = scrap(i).Y - 1
            END IF

            IF scrap(i).X >= win.RIGHT THEN
                scrap(i).X = INT(RND * win.WIDTH) * -1
            END IF

            _PUTIMAGE (scrap(i).X, scrap(i).Y), scrap(i).PIC
        END IF
    NEXT

END SUB
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB movebackgroundscrap '=============================================SUB MOVE BACKGROUND SCRAP

    FOR i = 1 TO bscrap
        RANDOMIZE TIMER
        move = INT(RND * 100) + 1
        IF move < 7 THEN
            bgscrap(i).X = bgscrap(i).X - 1
        END IF
        IF move < 5 AND bgscrap(i).X < win.MIDX THEN
            bgscrap(i).Y = bgscrap(i).Y - 1
        END IF

        IF move < 5 AND bgscrap(i).X > win.MIDX THEN
            bgscrap(i).Y = bgscrap(i).Y + 1
        END IF

        IF bgscrap(i).X < win.LEFT THEN
            bgscrap(i).X = INT(RND * 100) + win.RIGHT
        END IF

        _PUTIMAGE (bgscrap(i).X, bgscrap(i).Y), bgscrap(i).PIC

    NEXT

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB playercollisioncheck '============================================= SUB PLAYER COLLISION CHECK

    FOR i = 1 TO numfighters

        IF (player.X + player.WIDTH >= fighters(i).X1) AND (player.X <= fighters(i).X1 + fighters(i).WIDTH1) AND (player.Y <= fighters(i).Y1 + fighters(i).HEIGHT1) AND (player.Y + player.HEIGHT >= fighters(i).Y1) THEN
            player.KILLED = 1
        END IF

        IF (player.X + player.WIDTH >= fighters(i).X2) AND (player.X <= fighters(i).X2 + fighters(i).WIDTH2) AND (player.Y <= fighters(i).Y2 + fighters(i).HEIGHT2) AND (player.Y + player.HEIGHT >= fighters(i).Y2) THEN
            player.KILLED = 1
        END IF

    NEXT

    FOR i = 1 TO numcruisers

        IF (player.X + player.WIDTH >= cruisers(i).X1) AND (player.X <= cruisers(i).X1 + cruisers(i).WIDTH1) AND (player.Y <= cruisers(i).Y1 + cruisers(i).HEIGHT1) AND (player.Y + player.HEIGHT >= cruisers(i).Y1) THEN
            player.KILLED = 1
        END IF

    NEXT

END SUB
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB changeweapon '============================================================SUB CHANGE WEAPON

    IF (k = 67 OR k = 99) THEN 'C
        IF weapontype = 2 THEN weapontype = 0
        weapontype = weapontype + 1 ' basic setting is 1
        SELECT CASE weapontype
            CASE 2 ' - single laser
                IF isaudioon = 1 THEN
                    _SNDVOL singlelaseraudio, soundlevel
                    _SNDPLAYCOPY singlelaseraudio
                END IF
            CASE 1 ' - rapid laser
                IF isaudioon = 1 THEN
                    _SNDVOL rapidlaseraudio, soundlevel
                    _SNDPLAYCOPY rapidlaseraudio
                END IF
        END SELECT
    END IF

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB newscreen '==============================================================SUB NEW SCREEN

    CLS
    win.WIDTH = 1000
    win.HEIGHT = 1000
    win.COLORS = 32
    SCREEN _NEWIMAGE(win.WIDTH, win.HEIGHT, win.COLORS)

END SUB
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB controls '==================================================================SUB CONTROLS

    '-----------------------------------------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 "c": LOCATE 13, 550: PRINT "change weapon"
    LOCATE 14, 300: PRINT "space bar": LOCATE 14, 550: PRINT "fire weapon"
    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
'ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB escapekey '===============================================================SUB ESCAPE KEY TO EXIT

    IF k = 27 THEN 'ESC KEY
        SYSTEM
    END IF

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB credits '============================================================SUB CREDITS

    _FONT gamefontlrg
    LOCATE 1, 460: PRINT "credits"
    LOCATE 8, 350: PRINT "23xx font created by"
    LOCATE 12, 420: PRINT "Tevinbloise"
    _DISPLAY
    SLEEP 3

    PCOPY 1, _DISPLAY
    PCOPY _DISPLAY, 1
    _FONT gamefontlrg
    LOCATE 1, 460: PRINT "credits"
    LOCATE 8, 160: PRINT "spaceship models created in blender by"
    LOCATE 12, 320: PRINT "another_blender_user"
    _PUTIMAGE (400, 500), cruiserunit
    _PUTIMAGE (600, 500), player.PIC
    _PUTIMAGE (100, 600), carriersideunit
    _DISPLAY
    SLEEP 3

    PCOPY 1, _DISPLAY
    PCOPY _DISPLAY, 1
    _FONT gamefontlrg
    LOCATE 1, 460: PRINT "credits"
    LOCATE 8, 320: PRINT "sound effects created by"
    LOCATE 12, 420: PRINT "mariosello1"
    _DISPLAY
    SLEEP 3

    PCOPY 1, _DISPLAY
    PCOPY _DISPLAY, 1
    _FONT gamefontlrg
    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"
    _DISPLAY
    SLEEP 3

    PCOPY 1, _DISPLAY
    PCOPY _DISPLAY, 1
    _FONT gamefontlrg
    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

    PCOPY 1, _DISPLAY
    PCOPY _DISPLAY, 1
    _FONT gamefontlrg
    LOCATE 1, 460: PRINT "credits"
    _FONT gamefontmed
    LOCATE 4, 360: PRINT "first 100 instagram followers"
    _PUTIMAGE (0, 100), creditsinsta
    _DISPLAY
    SLEEP 5

    PCOPY 1, _DISPLAY
    PCOPY _DISPLAY, 1
    _FONT gamefontlrg
    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

    PCOPY 1, _DISPLAY
    PCOPY _DISPLAY, 1
    _FONT gamefontlrg
    LOCATE 1, 460: PRINT "credits"
    _FONT gamefontlrg
    LOCATE 10, 430: PRINT ". . . and you!"
    _DISPLAY
    SLEEP 3

END SUB
'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
SUB debugtools '=========================================================SUB PLACEMENT TOOLS

    '_PUTIMAGE (1, 1), statusbarpic
    SELECT EVERYCASE loadlevel '        - determine what debug tools to load based on level
        CASE IS >= 1
            _FONT gamefontmed
            LOCATE 1, 1: PRINT "HEALTH: "; player.HEALTH
            PRINT "Scrap: "; scrapcollected; " /"; numscrap;
            'PRINT "fighters: "; numfighters
            'PRINT "cruisers: "; numcruisers
        CASE 2
            LOCATE 3, 1: PRINT "Shotdown: "; shotdown; " /"; numall
    END SELECT

END SUB
