function Find_Length (X1, Y1, X2, Y2 : int) : real
 
 
    result sqrt (((X2 - X1) ** 2) + ((Y2 - Y1) ** 2))
 
 
end Find_Length
 
 
process Boss_Defeat_Sound
 
    for D : 1 .. 40
 
        sound (D * 10, 100)
 
    end for
 
end Boss_Defeat_Sound
 
 
process Boom
 
    sound (100, 100)
 
end Boom
 
 
process Boom2
 
    sound (300, 200)
 
    sound (100, 100)
 
end Boom2
 
%%%%Vars and consts
 
const NUM_OF_STARS := 100
 
const BULLET_NUM := 20
 
const NUM_OF_ENEMIES := 100
 
const SPEED := 4
 
 
var XS, YS : array 1 .. NUM_OF_STARS of int
 
var XE, YE : array 1 .. NUM_OF_ENEMIES of int
 
var XB, YB : array 1 .. NUM_OF_ENEMIES of int
 
var DX, DY : array 1 .. NUM_OF_ENEMIES of int
 
var Count : array 1 .. NUM_OF_ENEMIES of int
 
var DXB : int1 := 1
 
var BulletNum : nat1 := 1
 
var Fire : boolean := false
 
var BossKill : boolean := false
 
var BossHealth : int1 := 100
 
var PCount : array 1 .. BULLET_NUM of nat2
 
var XPB, YPB : array 1 .. BULLET_NUM of int
 
var PauseKey : char
 
var EnHit : array 1 .. NUM_OF_ENEMIES of boolean
 
var Hit : array 1 .. BULLET_NUM of boolean
 
var GotOne : array 1 .. BULLET_NUM of boolean
 
var Key : array char of boolean
 
var Boss : boolean := false
 
var KillCount : nat
 
var BX, BY : int
 
var X, Y : int
 
var Shields : int := 100
 
var Font1 : int := Font.New ("Fixedsys:50")
 
var Font2 : int := Font.New ("Fixedsys:30")
 
var Font3 : int := Font.New ("Fixedsys:12")
 
var IntToString : string
 
var HC : int := 10
 
% setup screen
 
setscreen ("graphics:max,max,nobuttonbar,offscreenonly,title:SPACE ACE")
 
colorback (7)
 
cls
 
 
%starting values for vars
 
 
 
 
const MID_X := maxx div 2
 
const MID_Y := maxy div 2
 
 
for Index : 1 .. NUM_OF_STARS
 
    randint (XS (Index), 1, maxx)
 
    randint (YS (Index), 1, maxy)
 
end for
 
 
for Index : 1 .. NUM_OF_ENEMIES
 
    randint (XE (Index), 1, maxx)
 
    YE (Index) := maxy + 200
 
    XB (Index) := XE (Index)
 
    YB (Index) := YE (Index)
 
 
    randint (DX (Index), -1, 1)
 
 
 
    Count (Index) := 0
 
    EnHit (Index) := false
 
 
end for
 
BX := MID_X - NUM_OF_ENEMIES div 2
 
BY := maxy - 40
 
 
X := MID_X
 
Y := 15
 
for Index : 1 .. BULLET_NUM
 
    Hit (Index) := false
 
    PCount (Index) := 0
 
    GotOne (Index) := false
 
    KillCount := 0
 
    YPB (Index) := 1
 
    XPB (Index) := 1
 
end for
 
 
%Menu
 
 
cls
 
Font.Draw ("Space Ace", 150, 400, Font1, 10)
 
Font.Draw ("Made by Peter Watt", 150, 200, Font2, 0)
 
Font.Draw ("(press any key to continue)", 50, 100, Font2, 10)
 
for Index : 1 .. NUM_OF_STARS
 
    drawdot (XS (Index), YS (Index), 0)
 
 
 
    if YS (Index) < 1 then
 
        YS (Index) := maxy
 
        randint (XS (Index), 1, maxx)
 
    end if
 
 
    YS (Index) := YS (Index) - SPEED
 
end for
 
 
drawfilloval (X, Y + 3, 5, 5, 0)
 
drawfillbox (X - 5, Y - 10, X + 5, Y + 5, 0)
 
drawfillbox (X - 10, Y - 8, X + 10, Y - 5, 0)
 
drawfillbox (X - 2, Y + 2, X + 2, Y - 1, 9)
 
View.Update
 
 
PauseKey := getchar
 
 
 
cls
 
 
 
color (15)
 
put "CONTROLS"
 
 
put "********"
 
put ""
 
put "Fire : space bar"
 
put "Pause : enter key"
 
put "Move left : left arrow key"
 
put "Move right : right arrow key"
 
put ""
 
 
color (10)
 
put "MISSION OBJECTIVE"
 
 
put "********"
 
put "The point of this mission is to destroy the enemy's latest weapon"
 
put "The weapon has been code named LIGHTING ROD because of it's new "
 
put "electro-beam canon witch causes great damage."
 
put "The enemy fighters should fall back to let the LIGHTING ROD destroy you"
 
put "if you destroy enough of them"
 
put "good luck"
 
color (0)
 
put ""
 
put ""
 
 
put "The strength of your shields is shown by the bar across the top of the" ..
 
put " screen."
 
 
put "Press any key to continue"
 
View.Update
 
PauseKey := getchar
 
 
%%%%%%%MAIN%%%%%%%%%%%%%%
 
 
 
 
 
 
color (0)
 
loop
 
    cls
 
 
    %STARS
 
    for Index : 1 .. NUM_OF_STARS
 
        drawdot (XS (Index), YS (Index), 0)
 
 
 
        if YS (Index) < 1 then
 
            YS (Index) := maxy
 
            randint (XS (Index), 1, maxx)
 
        end if
 
 
        YS (Index) := YS (Index) - SPEED
 
    end for
 
 
 
    %BAD GUYS
 
 
    for Index : 1 .. NUM_OF_ENEMIES
 
        if Boss = true then
 
            XE (Index) := BX + Index
 
            YE (Index) := BY
 
        else
 
 
            drawfilloval (XE (Index), YE (Index) - 3, 5, 5, 15)
 
            drawfillbox (XE (Index) - 5, YE (Index) + 10, XE (Index) + 5, YE (Index) - 5, 15)
 
            drawfillbox (XE (Index) - 10, YE (Index) + 8, XE (Index) + 10, YE (Index) + 5, 15)
 
            drawfillbox (XE (Index) - 2, YE (Index) - 2, XE (Index) + 2, YE (Index) + 1, 12)
 
        end if
 
        if XE (Index) > maxx or XE (Index) < 1 then
 
            DX (Index) := -DX (Index)
 
        end if
 
 
        XE (Index) := XE (Index) + DX (Index)
 
 
 
        if XE (Index) < X + 10 and XE (Index) > X - 10 and EnHit (Index) = false then
 
            EnHit (Index) := true
 
            Count (Index) := 0
 
            XB (Index) := XE (Index)
 
            YB (Index) := YE (Index)
 
        end if
 
        if EnHit (Index) = true then
 
            Count (Index) := Count (Index) + 1
 
            YB (Index) := YB (Index) - (SPEED * 3)
 
            if Boss = false then
 
                drawfilloval (XB (Index), YB (Index), 2, 3, 10)
 
 
            else
 
                drawfilloval (XB (Index), YB (Index), 2, 3, 14)
 
            end if
 
            if Count (Index) > 100 then
 
                EnHit (Index) := false
 
                Count (Index) := 0
 
            end if
 
            if XB (Index) < X + 10 and XB (Index) > X - 10 and YB (Index) > Y - 8
 
                    and YB (Index) < Y + 5 then
 
                Shields := Shields - 2
 
                fork Boom2
 
            end if
 
 
        end if
 
 
 
        if YE (Index) < 1 then
 
            randint (YE (Index), maxy + 50, maxy + 200)
 
            randint (XE (Index), 1, maxx)
 
        end if
 
        YE (Index) := YE (Index) - (SPEED div 2)
 
        if Boss = false then
 
            for PlayerHit : 1 .. BULLET_NUM
 
 
                if YPB (PlayerHit) < YE (Index) + 10 and YPB (PlayerHit) > YE (Index) - 5 and XPB (PlayerHit) > XE (Index) - 10 and
 
                        XPB (PlayerHit) < XE (Index) + 10 and GotOne (PlayerHit) = false then
 
                    randint (YE (Index), maxy + 50, maxy + 200)
 
                    randint (XE (Index), 1, maxx)
 
                    GotOne (PlayerHit) := true
 
                    KillCount := KillCount + 1
 
                    if KillCount >= 200 then
 
                        Boss := true
 
                    end if
 
 
 
                    fork Boom
 
                end if
 
 
 
 
            end for
 
        end if
 
    end for
 
 
    %Player
 
    Input.KeyDown (Key)
 
 
    if X - 10 < 1 then
 
        X := X + SPEED
 
    elsif X + 10 > maxx then
 
        X := X - SPEED
 
    end if
 
 
    if Key (KEY_RIGHT_ARROW) then
 
        X := X + SPEED
 
    elsif Key (KEY_LEFT_ARROW) then
 
        X := X - SPEED
 
    end if
 
    % pause
 
    if Key (KEY_ENTER) then
 
 
        Font.Draw ("Game Paused", MID_X - 200, MID_Y + 100, Font1, 0)
 
        Font.Draw ("(press any key to continue", MID_X - 100, MID_Y, Font3, 0)
 
        View.Update
 
        PauseKey := getchar
 
    end if
 
 
    %shooting
 
    if Key (' ') and Fire = false then
 
        Fire := true
 
        YPB (BulletNum) := Y
 
        XPB (BulletNum) := X
 
        PCount (BulletNum) := 0
 
        Hit (BulletNum) := true
 
        GotOne (BulletNum) := false
 
        if BulletNum >= BULLET_NUM then
 
            BulletNum := 1
 
        else
 
            BulletNum := BulletNum + 1
 
        end if
 
 
    elsif Key (' ') = false then
 
        Fire := false
 
 
    end if
 
    for Index : 1 .. BULLET_NUM
 
 
        if Hit (Index) = true then
 
 
            YPB (Index) := YPB (Index) + (SPEED * 3)
 
 
            PCount (Index) := PCount (Index) + 1
 
            if PCount (Index) > 50 then
 
                Hit (Index) := false
 
            end if
 
        end if
 
        if GotOne (Index) = false and Hit (Index) then
 
            drawfilloval (XPB (Index), YPB (Index), 2, 3, 12)
 
        end if
 
    end for
 
    %drawplayer
 
    drawfilloval (X, Y + 3, 5, 5, 0)
 
    drawfillbox (X - 5, Y - 10, X + 5, Y + 5, 0)
 
    drawfillbox (X - 10, Y - 8, X + 10, Y - 5, 0)
 
    drawfillbox (X - 2, Y + 2, X + 2, Y - 1, 9)
 
 
 
 
 
    if BossKill = false and Boss = true then
 
        BX := BX + DXB
 
        if BX + NUM_OF_ENEMIES > maxx or BX <= 1 then
 
            DXB := -DXB
 
        end if
 
        drawfillbox (BX, BY, BX + NUM_OF_ENEMIES, BY + 20, 15)
 
        drawfilloval (BX + NUM_OF_ENEMIES div 2, BY + 3, 3, 4, 10)
 
        IntToString := intstr (BossHealth)
 
        drawfillbox (maxx - 18, 20 + (BossHealth * 2), maxx - 25, 20, 12)
 
        drawbox (maxx - 19, 21 + (101 * 2), maxx - 24, 22, 0)
 
        Font.Draw (IntToString + "%", maxx - 20, 10, Font3, 0)
 
        for Index : 1 .. BULLET_NUM
 
            if YPB (Index) < BY + 10 and YPB (Index) > BY and XPB (Index) > BX and
 
                    XPB (Index) < BX + NUM_OF_ENEMIES and GotOne (Index) = false then
 
                BossHealth := BossHealth - 1
 
                if BossHealth <= 0 then
 
                    BossKill := true
 
                end if
 
                GotOne (Index) := true
 
 
 
                fork Boom
 
            end if
 
        end for
 
    end if
 
    IntToString := intstr (KillCount)
 
    Font.Draw ("Enemies destroyed " + IntToString, 1, maxy - 35, Font3, 12)
 
 
    IntToString := intstr (Shields)
 
    if Shields < 60 and Shields > 30 then
 
        HC := 14
 
    elsif Shields < 30 then
 
        HC := 12
 
    end if
 
 
    drawbox (maxx - 400, maxy - 20, maxx - 200, maxy - 10, 0)
 
    drawfillbox (maxx - 398, maxy - 18, maxx - 398 + (Shields * 2), maxy - 12, HC)
 
    Font.Draw (IntToString + "%", maxx - 198, maxy - 20, Font3, 0)
 
 
    View.Update
 
    exit when Shields <= 0 or BossKill = true
 
    delay (10)
 
end loop
 
 
var XEX, YEX : int
 
var RY : int
 
if Shields <= 0 then
 
    Font.Draw ("You've been killed!", 1, MID_Y, Font1, 10)
 
    for Explosion : 1 .. 300
 
        loop
 
            randint (XEX, X - 40, X + 40)
 
            randint (YEX, Y - 40, Y + 40)
 
            exit when Find_Length (X, Y, XEX, YEX) < 40
 
        end loop
 
 
        randint (RY, 1, 2)
 
        if RY = 1 then
 
            RY := 12
 
        else
 
            RY := 14
 
        end if
 
        drawdot (XEX, YEX, RY)
 
    end for
 
else
 
    fork Boss_Defeat_Sound
 
    for Explosion : 1 .. 300
 
 
        randint (XEX, BX + NUM_OF_ENEMIES div 2 - 70, BX + NUM_OF_ENEMIES div 2 + 70)
 
        randint (YEX, BY - 70, BY + 70)
 
 
 
 
 
 
        randint (RY, 1, 2)
 
        if RY = 1 then
 
            RY := 12
 
        else
 
            RY := 14
 
        end if
 
        drawdot (XEX, YEX, RY)
 
    end for
 
    Font.Draw ("You Win!", MID_X - 50, MID_Y, Font1, 10)
 
end if
 
 
View.Update
 
PauseKey := getchar
 
  |