TGC Codebase Backup



Space Shooter 2 by Quantum Universe

10th Apr 2005 9:20
Summary

This game is like it's predecessor, but with a different style of programming.



Description

Instead of writing most of the code inside the main loop, or by using subroutines, I created a lot of functions. This forced me to make a lot of arrays, but the code should be easier to follow and easier to improve. (You must take into account that the program is 3 times longer than the original version).



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    RemStart
   The media files can be found in:
      C:/.../Dark Basic/SoftwareDark/Basicmedia/sounds/explode/explode3
      C:/.../Dark Basic/SoftwareDark/Basicmedia/sounds/explode/explode4
      C:/.../Dark Basic/SoftwareDark/Basicmedia/sounds/weapons/phaser
      C:/.../Dark Basic/SoftwareDark/Basicmedia/sounds/weapons/voidhum
   I've created a main menu and HUD to make the game more user friendly.
I haven't been able to use light or make the camera shake in this version,
but hopefully this won't affect the gameplay. I don't think the game slows
down (at least nowhere near as much as the first version). Again, if you 
have any comments, feel free to contact me. Thanks for playing.
RemEnd

Rem Button Arrays
Dim ButtonTop(100)
Dim ButtonBottom(100)
Dim ButtonLeft(100)
Dim ButtonRight(100)
Dim ButtonName$(100)
Dim ButtonIndex(100)
Dim MaxButtonIndex(1)

Rem Laser Arrays
Dim SlotNumber(1)
Dim Weapon(1)
Dim LaserIndex(200)
Dim MaxLaserIndex(10)
Dim LaserXPos#(200)
Dim LaserYPos#(200)
Dim LaserZPos#(200)
Dim LaserAngleX#(200)
Dim LaserAngleY#(200)
Dim LaserAngleZ#(200)
Dim LaserReload(10)
Dim Ammo(10)
Dim LaserDamage(200)
Dim LaserEnergy(1)
Dim LaserSoundIndex(200)

Rem Asteroid Arrays
Dim AsteroidIndex(200)
Dim MaxAsteroidIndex(1)
Dim AsteroidHealth(200)
Dim AsteroidType(200)
Dim AsteroidXPos#(200)
Dim AsteroidYPos#(200)
Dim AsteroidZPos#(200)
Dim Spin#(200)
Dim AsteroidSoundIndex(200) 

Rem Powerup Arrays
Dim MaxPowerUpIndex(1)
Dim PowerUpIndex(200)
Dim PowerUpXPos#(200)
Dim PowerUpYPos#(200)
Dim PowerUpZPos#(200)

Rem Explosion Arrays
Dim MaxExplosionIndex(1)
Dim ExplosionIndex(200,5)
Dim ExplosionScale(200)
Dim MaxPlainNumber(1)
Dim ExplosionDelay(200)
Dim ExplosionSoundIndex(200)

Rem Sounds
Dim MaxAsteroidSoundIndex(1)
Dim MaxLaserSoundIndex(1)
Dim MaxExplosionSoundIndex(1)
Dim MaxDeathSoundIndex(1)
Dim DeathSoundIndex(200)
Dim DeathSoundTimer(200)

Rem Game Distance Limits
Dim MaxDistance#(1)
Dim MinDistance#(1)

Rem Game Data
Dim Level(1)
Dim PlayerScore(1)
Dim HighestScore(10)
Dim HighScores(10)
Dim HighScoreNames$(10)
Dim ScoreOrder(10)
Dim Health(1)
Dim Speed#(1)
MinTimeDelay = 100

BackDropBitmap()

MainMenu()

Rem Main Loop
Do

Rem Position Camera
Position Camera 250,0,250
Point Camera 250,250,250
Position Listener 250,0,250

Rem Move onto next level
If PlayerScore(1) >= Level(1)*50
   NextLevel()
   If MinDelay > 50 Then MinTimeDelay = MinTimeDelay - 10
EndIf

Rem Print HUD
HUD()

Rem Aim
Aim()

If Type < 5 Then Type = rnd((Level(1)-1))+1

Rem Make Asteroids
If TimeDelay <= 0
   MakeAsteroid(1,Type)
   TimeDelay = rnd(150) + MinTimeDelay
Else
   TimeDelay = TimeDelay - (Speed#(1)/2) - 1
EndIf

MoveAsteroid()
DeathSound()

Rem Shoot Weapon
If Mouseclick() = 1 
   Weapon(1) = 1
   MakeLaser(1)
EndIf

If Mouseclick() = 2
   Weapon(1) = SlotNumber(1)
   MakeLaser(1)
EndIf

If Controlkey() = 1
   If Delay = 0
      Delay = 20
      SlotNumber(1) = SlotNumber(1) + 1
      If SlotNumber(1) = 4 Then SlotNumber(1) = 2
   EndIf
EndIf

If Upkey() = 1
   If Speed#(1) < 5 Then Speed#(1) = Speed#(1) + 0.01
EndIf

If Downkey() = 1
   If Speed#(1) > 1 Then Speed#(1) = Speed#(1) - 0.01
EndIf

If Escapekey() = 1 Then Quit("Game")

If Delay > 0 Then Dec Delay

MoveLaser()

Rem Destroy Asteroid and Laser
LaserCollision()
DeleteLaser()
DeleteAsteroid()

Rem Scale or delete explosion
FinishExplosion()

Rem Move or destroy power ups
MovePowerUp()
DeletePowerUp()

If Health(1) <=0 Then Death()

Rem Position Camera Again
Position Camera 250,0,250
Point Camera 250,250,250

Sync
Loop

Rem This is a glossary of all the functions in order
RemStart

MakeAsteroid(Index,Type)
Aim()
MakeLaser(Index)
MoveLaser()
MoveAsteroid()
LaserCollision()
DeleteLaser()
MainMenu()
HUD()
LoadGame()
NextLevel()
DeleteAsteroid()
Death()
WriteData(Mode)
SaveScore()
Button(Left,Top,Right,Bottom,Name$)
DeleteButton()
ShowHighScores()
Quit(PreviousPage$)
PowerUp(AsteroidNumber)
MovePowerUp()
DeletePowerUp()
DestroyAsteroid(Index)
MakeExplosion(Number)
FinishExplosion()
ExplosionBitmap()
BackDropBitmap()
AsteroidBitmap()
PowerUpBitmap()
DeathBitmap()
Instructions()
DeathSound()

RemEnd

Rem ------------------------- Create Asteroids ----------------------------
Function MakeAsteroid(Index,Type)

SoundIndex = 1

GetIndexNumber:
   
If Object Exist(Index) = 1
   Inc Index
   Goto GetIndexNumber
Else
   Size = Type*10
   Make Object Box Index,Size,Size,Size
   Make Object Collision Box Index,0-(Size/2),0-(Size/2),0-(Size/2),(Size/2),(Size/2),(Size/2),0
   Show Object Index
   Texture Object Index,3
   AsteroidHealth(Index) = 100+(Type*50)
   AsteroidType(Index) = Type
   AsteroidXPos#(Index) = rnd(300)+100
   AsteroidYPos#(Index) = (MaxDistance#(1)+(50*Type))
   AsteroidZPos#(Index) = rnd(200)+150
   Spin#(Index)=rnd(30)
   Position Object Index,AsteroidXPos#(Index),AsteroidYPos#(Index),AsteroidZPos#(Index)
   AsteroidIndex(Index) = 1
   If MaxAsteroidIndex(1) < Index Then MaxAsteroidIndex(1) = Index 
   GetSoundIndex:
   If Sound Exist(SoundIndex) = 1
      Inc SoundIndex
      Goto GetSoundIndex
   Else
      Load 3DSound "voidhum.wav",SoundIndex
      Play Sound SoundIndex
      Loop Sound SoundIndex
      Set Sound Volume SoundIndex,100
      Position Sound SoundIndex,AsteroidXpos#(Index),AsteroidYpos#(Index),AsteroidZpos#(Index)
      AsteroidSoundIndex(SoundIndex) = Index
      If MaxAsteroidSoundIndex(1) < SoundIndex Then MaxAsteroidSoundIndex(1) = SoundIndex 
   EndIf
EndIf

EndFunction
Rem -----------------------------------------------------------------------   

Rem ---------------------------- Move Cursor ------------------------------
Function Aim()

For x = 1 to 8

   Angle = 360/8

   Top = MouseX()+(12*cos(wrapvalue(Angle*x)))
   Bottom = MouseX()+(5*cos(wrapvalue(Angle*x)))
   Left = MouseY()+(12*sin(wrapvalue(Angle*x)))
   Right = MouseY()+(5*sin(wrapvalue(Angle*x)))
 
   Line Top,Left,Bottom,Right 

Next x
   
EndFunction
Rem ----------------------------------------------------------------------- 

Rem ---------------------------- Make Laser -------------------------------
Function MakeLaser(Index)

SoundIndex = 1

GetIndexNumber:
   
If Object Exist(Index) = 1
   Inc Index
   Goto GetIndexNumber
Else
   If LaserReload(Weapon(1)) = 0
      MakeWeaponData = 0
      If Weapon(1) = 1 and LaserEnergy(1) > 0
         Make Object Cylinder Index,2
         Make Object Collision Box Index,-1,-2,-1,1,2,1,0
         Show Object Index
         Scale Object Index,100,500,100
         Set Object Index,0,90,0,0
         Ghost Object On Index
         Color Object Index,rgb(20,50,250)
         LaserReload(Weapon(1)) = 10
         LaserDamage(Index) = 50
         LaserEnergy(1) = LaserEnergy(1) - 5
         MakeWeaponData = 1
      EndIf
      If Weapon(1) = 2 and Ammo(Weapon(1)) > 0
         Make Object Cylinder Index,2
         Make Object Collision Box Index,-1,-2,-1,1,2,1,0
         Show Object Index
         Scale Object Index,200,500,200
         Set Object Index,0,90,0,0
         Ghost Object On Index
         Color Object Index,rgb(150,50,250)
         LaserReload(Weapon(1)) = 100
         LaserDamage(Index) = 200
         Ammo(Weapon(1)) = Ammo(Weapon(1)) - 1
         MakeWeaponData = 1
      EndIf
      If Weapon(1) = 3 and Ammo(Weapon(1)) > 0
         Make Object Cylinder Index,2
         Make Object Collision Box Index,-1,-2,-1,1,2,1,0
         Show Object Index
         Scale Object Index,200,500,200
         Set Object Index,0,90,0,0
         Ghost Object On Index
         Color Object Index,rgb(150,250,150)
         LaserReload(Weapon(1)) = 50
         LaserDamage(Index) = 100
         Ammo(Weapon(1)) = Ammo(Weapon(1)) - 1
         MakeWeaponData = 1
      EndIf
      If MakeWeaponData = 1
         XScaleDist# = 82.5
         ZScaleDist# = 60.0
         XMouseScale# = MouseX()/(640/XScaleDist#)
         ZMouseScale# = MouseY()/(480/ZScaleDist#)
         circum# = 3.14159*50
         LaserAngleX#(Index) = wrapvalue((((ZScaleDist#/2)-ZMouseScale#)/circum#)*180)
         LaserAngleY#(Index) = 0
         LaserAngleZ#(Index) = wrapvalue(0-((((XScaleDist#/2)-XMouseScale#)/circum#)*180))
         LaserXpos#(Index) = 250+(XScaleDist#/2)-XMouseScale#
         LaserYPos#(Index) = 50
         LaserZpos#(Index) = 250+(ZScaleDist#/2)-ZMouseScale#
         Position Object Index,LaserXpos#(Index),LaserYpos#(Index),LaserZpos#(Index)
         Rotate Object Index,LaserAngleX#(Index),LaserAngleY#(Index),LaserAngleZ#(Index)
         LaserIndex(Index) = 1
         If MaxLaserIndex(1) < Index Then MaxLaserIndex(1) = Index
         GetSoundIndex:
         If Sound Exist(SoundIndex) = 1
            Inc SoundIndex
            Goto GetSoundIndex
         Else
            Load 3DSound "phaser.wav",SoundIndex
            Play Sound SoundIndex
            Set Sound Volume SoundIndex,80
            Position Sound SoundIndex,LaserXpos#(Index),LaserYpos#(Index),LaserZpos#(Index)
            LaserSoundIndex(SoundIndex) = Index
         If MaxLaserSoundIndex(1) < SoundIndex Then MaxLaserSoundIndex(1) = SoundIndex 
         EndIf
      EndIf
   EndIf
EndIf

EndFunction
Rem -----------------------------------------------------------------------

Rem ---------------------------- Move Laser -------------------------------
Function MoveLaser()

For x = 1 to MaxLaserIndex(1)
   If LaserIndex(x) = 1
      LaserXpos#(x) = LaserXpos#(x)-(10*sin(LaserAngleZ#(x)))
      LaserYPos#(x) = LaserYPos#(x)+10
      LaserZpos#(x) = LaserZpos#(x)+(10*sin(LaserAngleX#(x)))
      Position Object x,LaserXpos#(x),LaserYpos#(x),LaserZpos#(x)     
   EndIf
Next x

For y = 1 to 10
   If LaserReload(y) > 0 Then LaserReload(y) = LaserReload(y) - 1  
Next y

If LaserEnergy(1) < 0 Then LaserEnergy(1) = 0

EndFunction
Rem ----------------------------------------------------------------------- 

Rem -------------------------- Move Asteroid ------------------------------
Function MoveAsteroid()

For x = 1 to MaxAsteroidIndex(1)
   If AsteroidIndex(x) = 1
      AsteroidYPos#(x) = AsteroidYPos#(x) - speed#(1)
      Position Object x,AsteroidXPos#(x),AsteroidYPos#(x),AsteroidZPos#(x)
      XRotate Object x,Wrapvalue(Object Angle X(x)+Spin#(x))
      YRotate Object x,Wrapvalue(Object Angle Y(x)+Spin#(x))
      ZRotate Object x,Wrapvalue(Object Angle Z(x)+Spin#(x))
   EndIf
   For y = 1 to MaxAsteroidSoundIndex(y)
      If AsteroidSoundIndex(y) > 0
         Position Sound y,AsteroidXPos#(x),AsteroidYPos#(x),AsteroidZPos#(x)
      EndIf
   Next y
Next x

EndFunction
Rem ----------------------------------------------------------------------- 

Rem -------------------------- Laser Collision ----------------------------
Function LaserCollision()

For x = 1 to MaxAsteroidIndex(1)
   If AsteroidIndex(x) = 1
      For y = 1 to MaxLaserIndex(1)
         If LaserIndex(y) = 1
            If AsteroidIndex(x) = 1
               If Object Collision(x,y)>0
                  AsteroidHealth(x) = AsteroidHealth(x) - (LaserDamage(y)*((90+rnd(20))/100.0))
                  LaserIndex(y) = 0
                  Hide Object y
                  Delete Object y
                  For n = 1 to MaxLaserIndex(1)
                     If LaserIndex(n) = 1 Then MaxLaserIndex = n
                  Next n
                  MaxLaserIndex(1) = MaxLaserIndex
                  For m = 1 to MaxLaserSoundIndex(1)
                     If LaserSoundIndex(m) = y
                        LaserSoundIndex(m) = 0
                        Delete Sound m
                        For n = 1 to MaxLaserSoundIndex(1)
                           If LaserSoundIndex(n) > 0 Then MaxLaserSoundIndex = n
                        Next n
                        MaxLaserSoundIndex(1) = MaxLaserSoundIndex
                     EndIf
                  Next m
               EndIf
            EndIf
         EndIf
      Next y
   DestroyAsteroid(x)
   EndIf
Next x
For y = 1 to MaxLaserIndex(1)
   If LaserIndex(y) = 1
      For z = 1 to MaxPowerUpIndex(1)
         If PowerUpIndex(z) > 0
            If Object Collision(y,z) > 0
               Select PowerUpIndex(z)
                  Case 1 : LaserEnergy(1) = 10000 : EndCase
                  Case 2 : Ammo(2) = Ammo(2) + 5 : EndCase
                  Case 3 : Ammo(3) = Ammo(3) + 10 : EndCase
                  Case 4 : Health(1) = 100 : EndCase
               EndSelect
               PowerUpIndex(z) = 0
               Hide Object z
               Delete Object z
               For o = 1 to MaxPowerUpIndex(1)
                  If PowerUpIndex(o) = 1 Then MaxPowerUpIndex = o
               Next o
               MaxPowerUpIndex(1) = MaxPowerUpIndex
               LaserIndex(y) = 0
               Hide Object y
               Delete Object y
               For n = 1 to MaxLaserIndex(1)
                  If LaserIndex(n) = 1 Then MaxLaserIndex = n
               Next n
               MaxLaserIndex(1) = MaxLaserIndex
            EndIf
         EndIf
      Next z
   EndIf
Next y

EndFunction
Rem -----------------------------------------------------------------------

Rem --------------------------- Delete Laser ------------------------------
Function DeleteLaser()

For x = 1 to MaxLaserIndex(1)
   If LaserIndex(x) = 1
      If LaserYPos#(x) > (MaxDistance#(1)+250)
         LaserIndex(x) = 0
         Hide Object x
         Delete Object x
         For y = 1 to MaxLaserIndex(1)
            If LaserIndex(y) = 1 Then MaxLaserIndex = y
         Next y
         MaxLaserIndex(1) = MaxLaserIndex
         For m = 1 to MaxLaserSoundIndex(1)
            If LaserSoundIndex(m) = x
               LaserSoundIndex(m) = 0
               Delete Sound m
               For n = 1 to MaxLaserSoundIndex(1)
                  If LaserSoundIndex(n) > 0 Then MaxLaserSoundIndex = n
               Next n
               MaxLaserSoundIndex(1) = MaxLaserSoundIndex
            EndIf
         Next m
      EndIf
   EndIf
Next x

EndFunction
Rem -----------------------------------------------------------------------

Rem ----------------------------- Main Menu -------------------------------
Function MainMenu()

MainMenu:

Sync On
Sync Rate 60
BackDrop On

Texture BackDrop 2

WriteData(1)
PlayGame = 0

rem WriteData(1)

Show Mouse

Repeat

DeleteButton()

Ink rgb(50,50,200),0
Button(250,120,390,170,"Play")
Button(250,190,390,240,"Instructions")
Button(250,260,390,310,"HighScores")
Button(250,330,390,380,"QuitGame") 

For x = 1 to MaxButtonIndex(1)
   If ButtonIndex(x) = 1
      If MouseX() > ButtonLeft(x) and MouseX() < ButtonRight(x)
         If MouseY() >  ButtonTop(x) and MouseY() < ButtonBottom(x)
            Ink rgb(0,0,0),0
            If MouseClick() = 1
               If ButtonName$(x) = "Play"
                  Repeat
                  Until MouseClick() = 0
                  PlayGame = 1
               EndIf
               If ButtonName$(x) = "Instructions" 
                  Repeat
                  Until MouseClick() = 0
                  Instructions()
                  Goto MainMenu
               EndIf
               If ButtonName$(x) = "HighScores" 
                  Repeat
                  Until MouseClick() = 0
                  ShowHighScores()
                  Goto MainMenu
               EndIf
               If ButtonName$(x) = "QuitGame" 
                  Repeat
                  Until MouseClick() = 0
                  Quit("MainMenu")
               EndIf
            EndIf
         Else
            Ink rgb(255,255,255),0
         EndIf
      Else
         Ink rgb(255,255,255),0
      EndIf
      Set Text Font "Comic Sans MS"
      Set Text To Bold
      Set Text Size 25
      If ButtonName$(x) = "Play" Then Center Text 320,135,"Play Game"
      If ButtonName$(x) = "Instructions" Then Center Text 320,205,"Instructions"
      If ButtonName$(x) = "HighScores" Then Center Text 320,275,"High Scores"
      If ButtonName$(x) = "QuitGame" Then Center Text 320,345,"Quit"
   EndIf
Next x 

sync
Until PlayGame=1

DeleteButton()

cls

BackDrop Off
Center Text 320,240,"Loading"

LoadGame()

EndFunction
Rem -----------------------------------------------------------------------

Rem -------------------------------- HUD ----------------------------------
Function HUD()

Ink rgb(50,50,200),0
Box 0,0,639,30

Rem Draw player score
Ink rgb(255,255,255),0
Set Text Font "Comic Sans MS"
Set Text Size 20
Text 10,5,"PlayerScore:"
Set Cursor 110,8
Print PlayerScore(1)

Rem Draw health
Text 140,5,"Health:"
Set Cursor 200,8
Print Health(1)

Rem Draw laser energy
Text 240,5,"Energy:"
Set Cursor 300,8
Print LaserEnergy(1)

Rem Draw secondary weapon
Text 350,5,"Secondary Weapon:"
Set Cursor 515,8
Print Ammo(SlotNumber(1))

If SlotNumber(1) = 2 
   Ink rgb(150,50,250),0
   Box 490,5,510,25
   Ink rgb(255,255,255),0
   Set Text Font "System"
   Set Text Size 10
   Center Text 500,8,"N"
EndIf

If SlotNumber(1) = 3 
   Ink rgb(150,250,150),0
   Box 490,5,510,25
   Ink rgb(255,255,255),0
   Set Text Font "System"
   Set Text Size 10
   Center Text 500,8,"P"
EndIf


Rem Draw Radar
Ink rgb(50,50,200),0
Box 0,400,50,479
Ink rgb(200,100,50),0
For x = 1 To MaxAsteroidIndex(1)
   If AsteroidIndex(x) = 1
      Left = 25+((250-AsteroidXPos#(x))*(39.0/300))
      Top = 440+((((250+MaxDistance#(1))/2)-AsteroidYPos#(x))*(79.0/(250+MaxDistance#(1))))
      Circle Left,Top,2
   EndIf
Next x
Ink rgb(255,255,255),0
For x = 1 to 50
   Dot x,459+(20*sin(x*3.6))
Next x

Rem Draw Speed Bar
Ink rgb(50,50,200),0
Box 580,460-(speed#(1)*19),610,441
Ink rgb(255,255,255),0
Line 580,365,610,365
Line 610,365,610,441
Line 580,365,580,441
Line 580,441,610,441
Set Text Font "Comic Sans MS"
Set Text Size 20
Center Text 595,450,"Throttle"


Rem Limit Mouse Movement
If MouseY() < 30 Then Position Mouse MouseX(),30

EndFunction
Rem -----------------------------------------------------------------------

Rem ----------------------------- Load Game -------------------------------
Function LoadGame()

Rem Set Arrays
For x = 1 to 200
   LaserIndex(x) = 0
   LaserXPos#(x) = 0
   LaserYPos#(x) = 0
   LaserZPos#(x) = 0
   LaserAngleX#(x) = 0
   LaserAngleY#(x) = 0
   LaserAngleZ#(x) = 0
   LaserDamage(x) = 0
   LaserSoundIndex(x) = 0
   AsteroidIndex(x) = 0
   AsteroidHealth(x) = 0
   AsteroidType(x) = 0
   AsteroidXPos#(x) = 0
   AsteroidYPos#(x) = 0
   AsteroidZPos#(x) = 0
   AsteroidSoundIndex(x) = 0
   Spin#(x) = 0
   DeathSoundIndex(x) = 0 
   DeathSoundTimer(x) = 0  
   PowerUpIndex(x) = 0
   ExplosionSoundIndex(x) = 0
   ExplosionScale(x) = 0
   ExplosionDelay(x) = 0
   For z = 1 to 5
      ExplosionIndex(x,z) = 0
   Next z
Next x

For y = 1 to 10
   LaserReload(y) = 0
   MaxLaserIndex(y) = 0
Next y

SlotNumber(1) = 2
Weapon(1) = 0
MaxAsteroidIndex(1) = 0
MaxExplosionIndex(1) = 0
MaxPlainNumber(1) = 0
MaxPowerUpIndex(1) = 0
LaserEnergy(1) = 10000
Ammo(2) = 5
Ammo(3) = 10
MaxDistance#(1) = 700
MinDistance#(1) = 0
MaxDeathSoundIndex(1) = 0

Rem Game Data
Level(1) = 0
PlayerScore(1) = 0
Health(1) = 100

Rem Initialise Score Names
For x = 1 to 10
   If HighScoreNames$(x) = ""
      HighScoreNames$(x) = ".........."
   EndIf
Next x

Rem Create Bitmaps
ExplosionBitmap()
AsteroidBitmap()
PowerUpBitmap()
DeathBitmap()

Sync On
Sync Rate 60

BackDrop On
Texture BackDrop 2
Hide Mouse

Make Matrix 1,500,500,20,20

cls

EndFunction
Rem -----------------------------------------------------------------------

Rem ----------------------------- Next Level ------------------------------
Function NextLevel()

Level(1) = Level(1) + 1

Rem Reset some variables
For x = 1 to 200
   LaserIndex(x) = 0
   LaserXPos#(x) = 0
   LaserYPos#(x) = 0
   LaserZPos#(x) = 0
   LaserAngleX#(x) = 0
   LaserAngleY#(x) = 0
   LaserAngleZ#(x) = 0
   LaserDamage(x) = 0
   LaserSoundIndex(x) = 0

   Rem Asteroid Arrays
   AsteroidIndex(x) = 0
   AsteroidHealth(x) = 0
   AsteroidType(x) = 0
   AsteroidXPos#(x) = 0
   AsteroidYPos#(x) = 0
   AsteroidZPos#(x) = 0
   Spin#(x) = 0
   AsteroidSoundIndex(x) = 0
   
   Rem Power up arrays
   PowerUpIndex(x) = 0
   PowerUpXPos#(x) = 0
   PowerUpYPos#(x) = 0
   PowerUpZPos#(x) = 0
   
   Rem Explosion Arrays
   For z = 1 to 5
      ExplosionIndex(x,z) = 0
   Next z
   ExplosionScale(x) = 0
   ExplosionDelay(x) = 0
   ExplosionSoundIndex(x) = 0

   Rem Other Sounds
   DeathSoundTimer(x) = 0
   DeathSoundIndex(x) = 0

   Rem Delete Laser and Asteroids
   If Object Exist(x) = 1 Then Delete Object x
Next x

For y = 1 to 10
   LaserReload(y) = 0
   MaxLaserIndex(y) = 0
Next y

MaxAsteroidIndex(1) = 0
MaxPowerUpIndex(1) = 0
MaxExplosionIndex(1) = 0
MaxPlainNumber(1) = 0
speed#(1) = 1
MaxAsteroidSoundIndex(1) = 0
MaxLaserSoundIndex(1) = 0
MaxExplosionSoundIndex(1) = 0
MaxDeathSoundIndex(1) = 0

While Spacekey() = 0
   Ink rgb(255,255,255),0
   Set Text Font "System"
   Set Text Size 10
   Center Text 310,240,"Level"
   Set Cursor 330,240
   Print " ";Level(1)
   Center Text 320,260,"Press the spacebar to continue"
EndWhile

EndFunction
Rem -----------------------------------------------------------------------

Rem -------------------------- Delete Asteroid ----------------------------
Function DeleteAsteroid()

SoundIndex = 1

For x = 1 to MaxAsteroidIndex(1)
   If AsteroidIndex(x) = 1
      If AsteroidYPos#(x) < MinDistance#(1)
         AsteroidIndex(x) = 0
         Hide Object x
         Delete Object x
         Health(1) = Health(1) - (10*AsteroidType(x)*((90+rnd(20))/100.0))
         For y = 1 to MaxAsteroidIndex(1)
            If AsteroidIndex(y) = 1 Then MaxAsteroidIndex = y
         Next y
         MaxAsteroidIndex(1) = MaxAsteroidIndex
         For m = 1 to MaxAsteroidSoundIndex(1)
            If AsteroidSoundIndex(m) = y
               AsteroidSoundIndex(m) = 0
               Delete Sound m
               For n = 1 to MaxAsteroidSoundIndex(1)
                  If AsteroidSoundIndex(n) > 0 Then MaxAsteroidSoundIndex = n
               Next n
               MaxAsteroidSoundIndex(1) = MaxAsteroidSoundIndex
            EndIf
         Next m
         GetSoundIndex:
         If Sound Exist(SoundIndex) = 1
            Inc SoundIndex
            Goto GetSoundIndex
         Else
            Load Sound "explode4.wav",SoundIndex
            Play Sound SoundIndex
            Position Sound SoundIndex,AsteroidXpos#(x),AsteroidYpos#(x),AsteroidZpos#(x)
            DeathSoundIndex(SoundIndex) = x
            DeathSoundTimer(SoundIndex) = 50
            Texture BackDrop 8
            If MaxDeathSoundIndex(1) < SoundIndex Then MaxDeathSoundIndex(1) = SoundIndex 
         EndIf
      EndIf
   EndIf
Next x

EndFunction
Rem -----------------------------------------------------------------------

Rem ------------------------------- Death ---------------------------------
Function Death()

Rem Delete Laser and Asteroids
For x = 1 to 200
   If Object Exist(x) = 1 Then Delete Object x
   If Sound Exist(x) = 1 Then Delete Sound x
Next x

For y = 1 to 10
   Ammo(y) = 0
   LaserReload(y) = 0
   MaxLaserIndex(y) = 0
Next y

While Spacekey() = 0
   Ink rgb(255,255,255),0
   Set Text Font "System"
   Set Text Size 10
   Center Text 320,220,"Your spaceship blow up"
   Center Text 320,260,"Press the spacebar to start again"
EndWhile

SaveScore()

Rem Reset some variables
For x = 1 to 200
   LaserIndex(x) = 0
   LaserXPos#(x) = 0
   LaserYPos#(x) = 0
   LaserZPos#(x) = 0
   LaserAngleX#(x) = 0
   LaserAngleY#(x) = 0
   LaserAngleZ#(x) = 0
   LaserDamage(x) = 0
   LaserSoundIndex(x) = 0

   Rem Asteroid Arrays
   AsteroidIndex(x) = 0
   AsteroidHealth(x) = 0
   AsteroidType(x) = 0
   AsteroidXPos#(x) = 0
   AsteroidYPos#(x) = 0
   AsteroidZPos#(x) = 0
   Spin#(x) = 0
   AsteroidSoundIndex(x) = 0

   Rem Power up Arrays
   PowerUpIndex(x) = 0
   PowerUpXPos#(x) = 0
   PowerUpYPos#(x) = 0
   PowerUpZPos#(x) = 0

   Rem Explosion Arrays
   For z = 1 to 5
      ExplosionIndex(x,z) = 0
   Next z
   ExplosionScale(x) = 0
   ExplosionDelay(x) = 0
   ExplosionSoundIndex(x) = 0

   Rem Other Sounds
   DeathSoundIndex(x) = 0
   DeathSoundTimer(x) = 0
Next x

MaxDistance#(1) = 0
MinDistance#(1) = 0

SlotNumber(1) = 0
Weapon(1) = 0
LaserEnergy(1) = 0
Level(1) = 0
PlayerScore(1) = 0
Health(1) = 0
MinTimeDelay = 200
MaxAsteroidIndex(1) = 0
MaxPowerUpIndex(1) = 0
MaxAsteroidSoundIndex(1) = 0
MaxLaserSoundIndex(1) = 0
MaxExplosionSoundIndex(1) = 0
MaxDeathSoundIndex(1) = 0
speed#(1) = 1

Delete Matrix 1

cls

MainMenu()

EndFunction
Rem -----------------------------------------------------------------------

Rem ---------------------------- Write Data -------------------------------
Function WriteData(Mode)

Data$ = "High Scores.dat"

If Mode = 1
   Rem Open data
   If File Exist(Data$) = 1
       Open to Read 2,Data$
       For y = 1 to 10
          Read String 2,HighScoreNames$(y)
          Read Byte 2,HighScores(y)
       Next y
       Close File 2
   EndIf
EndIf

If Mode = 2
   If File Exist(Data$) = 1 Then Delete File Data$
   Open to Write 1,Data$
   For y = 1 to 10
      Write String 1,HighScoreNames$(y)
      Write Byte 1,HighScores(y)
   Next y

Close File 1
EndIf

EndFunction
Rem -----------------------------------------------------------------------

Rem ---------------------------- Save Scores ------------------------------
Function SaveScore()

FullList = 0
BackDrop off
cls

Ink rgb(50,50,200),0
Box 200,200,470,240
Box 220,30,420,80
Ink rgb(255,255,255),rgb(50,50,200)
Set Text Font "Comic Sans MS"
Set Text Size 20
Center Text 320,45,"High Scores"
Set Cursor 220,215

For y = 1 to 10
   If HighScores(y)=0
      Rem Get Name for Scores List
      GetScores:
      Input "Please enter your name: ";HighScoreNames$
      HighScoreNames$(y) = HighScoreNames$
      HighScores(y) = PlayerScore(1)
      FullList = 1
      y = 10
   EndIf
Next y  

If FullList = 0
   For y = 1 to 10
      If PlayerScore(1) > HighScores(y)
         For x = 1 to 10
            HighScores(11-x)=HighScores(10-x)
            HighScoreNames$(11-x)=HighScoreNames$(10-x)
            If y+x=10 
               x=10
               y = 10
            EndIf
         Next x
      Goto GetScores:
      EndIf 
   Next y
EndIf   


Ink rgb(255,255,255),0
BackDrop On

WriteData(2)

EndFunction
Rem -----------------------------------------------------------------------


Rem ---------------------------- Make Button ------------------------------
Function Button(Left,Top,Right,Bottom,Name$)

Index = 1

GetIndexNumber:

If ButtonIndex(Index) = 1
   Inc Index
   Goto GetIndexNumber
Else
   Ink rgb(50,50,200),0
   ButtonTop(Index) = Top
   ButtonBottom(Index) = Bottom
   ButtonLeft(Index) = Left
   ButtonRight(Index) = Right
   ButtonName$(Index) = Name$
   ButtonIndex(Index) = 1
   Box ButtonLeft(Index),ButtonTop(Index),ButtonRight(Index),ButtonBottom(Index)
   Ink rgb(20,20,20),0
   Line ButtonLeft(Index),ButtonBottom(Index),ButtonRight(Index),ButtonBottom(Index)
   Line ButtonRight(Index),ButtonTop(Index),ButtonRight(Index),ButtonBottom(Index)
   Ink rgb(255,255,255),0
   Line ButtonLeft(Index),ButtonTop(Index),ButtonRight(Index),ButtonTop(Index)
   Line ButtonLeft(Index),ButtonTop(Index),ButtonLeft(Index),ButtonBottom(Index)
   If MaxButtonIndex(1) < Index Then MaxButtonIndex(1) = Index
EndIf

EndFunction
Rem -----------------------------------------------------------------------

Rem --------------------------- Delete Button -----------------------------
Function DeleteButton()

For x = 1 to MaxButtonIndex(1)
   ButtonIndex(x) = 0
   ButtonName$(x) = ""
Next x

MaxButtonIndex(1) = 1

EndFunction
Rem -----------------------------------------------------------------------

Rem ---------------------------- High Scores ------------------------------
Function ShowHighScores()

WriteData(1)
DeleteButton()

cls

For z = 1 to 10
   HighestScore(z) = 0
   ScoreOrder(z) = -1
Next z

For x = 1 to 10
   Score = -1
   For y = 1 to 10
      If Score < HighScores(y) 
         If HighestScore(y) <> 1
            Score = HighScores(y) 
            ScoreOrder(x) = y
         EndIf
      EndIf   
   Next y
   For y = 1 to 10
      If ScoreOrder(y) <> -1 Then HighestScore(ScoreOrder(y)) = 1
   Next y
Next x

Repeat

DeleteButton()

Button(250,350,390,400,"Back")

Ink rgb(50,50,200),0
Box 220,30,420,80
Box 200,100,450,300

Ink rgb(255,255,255),0
Line 200,100,450,100
Line 450,100,450,300
Line 200,100,200,300
Line 200,300,450,300
Line 370,100,370,300

Line 220,30,420,30
Line 420,30,420,80
Line 220,30,220,80
Line 220,80,420,80

Set Text Font "Comic Sans MS"
Set Text Size 20
Center Text 320,45,"High Scores"

Set Text Font "System"
Set Text To Normal
Set Text Size 10

For m = 1 to 10
   If ScoreOrder(m) <> -1
      Line 200,100+(m*20),450,100+(m*20)
      Center Text 250,85+(m*20),HighScoreNames$(ScoreOrder(m))
      Set Cursor 400,85+(m*20)
      Print HighScores(ScoreOrder(m))
   EndIf
Next m

Back = 0

For x = 1 to MaxButtonIndex(1)
   If ButtonIndex(x) = 1
      If MouseX() > ButtonLeft(x) and MouseX() < ButtonRight(x)
         If MouseY() >  ButtonTop(x) and MouseY() < ButtonBottom(x)
            Ink rgb(0,0,0),0
            If MouseClick() = 1
               If ButtonName$(x) = "Back" 
                  Repeat
                  Until MouseClick() = 0
                  Back = 1
               EndIf
            EndIf
         Else
            Ink rgb(255,255,255),0
         EndIf
      Else
         Ink rgb(255,255,255),0
      EndIf
      Set Text Font "Comic Sans MS"
      Set Text To Bold
      Set Text Size 25
      If ButtonName$(x) = "Back" Then Center Text 320,365,"Back"
   EndIf
Next x

sync
Until Back = 1

DeleteButton()

cls

EndFunction
Rem -----------------------------------------------------------------------

Rem ----------------------------- Quit Game -------------------------------
Function Quit(PreviousPage$)

Click$ = ""

cls

Repeat

DeleteButton()

Button(225,270,275,320,"Yes")
Button(325,270,375,320,"No")

Ink rgb(255,255,255),0
Center Text 320,220,"Are you sure you want to quit?"

For x = 1 to MaxButtonIndex(1)
   If ButtonIndex(x) = 1
      If MouseX() > ButtonLeft(x) and MouseX() < ButtonRight(x)
         If MouseY() >  ButtonTop(x) and MouseY() < ButtonBottom(x)
            Ink rgb(0,0,0),0
            If MouseClick() = 1
               If ButtonName$(x) = "Yes" 
                  Repeat
                  Until MouseClick() = 0
                  WriteData(2)
                  Click$ = "Yes"
               EndIf
               If ButtonName$(x) = "No" 
                  Repeat
                  Until MouseClick() = 0
                  Click$ = "No"
               EndIf
            EndIf
         Else
            Ink rgb(255,255,255),0
         EndIf
      Else
         Ink rgb(255,255,255),0
      EndIf
      Set Text Font "Comic Sans MS"
      Set Text To Bold
      Set Text Size 25
      If ButtonName$(x) = "Yes" Then Center Text 250,280,"Yes"
      If ButtonName$(x) = "No" Then Center Text 350,280,"No"
   EndIf
Next x

sync
Until Click$ <> ""

DeleteButton()

cls

If Click$ = "Yes"
   If PreviousPage$ = "MainMenu" Then End
   If PreviousPage$ = "Game" Then MainMenu()
EndIf

If Click$ = "No"
   If PreviousPage$ = "MainMenu" Then MainMenu()
   Rem do nothing if PreviousPage$ = "Game"
EndIf

EndFunction
Rem -----------------------------------------------------------------------

Rem ------------------------------ Power Up -------------------------------
Function PowerUp(AsteroidNumber)

Index = 1

GetIndexNumber:
   
If Object Exist(Index) = 1
   Inc Index
   Goto GetIndexNumber
Else
   Make Object Sphere Index,20
   Make Object Collision Box Index,-10,-10,-10,10,10,10,0
   Show Object Index
   PowerUp = rnd(99)+1
   If PowerUp <= 5 Then PowerUpItem = 4
   If PowerUp > 5 and PowerUp <= 15 Then PowerUpItem = 1
   If PowerUp > 15 and PowerUp <= 40 Then PowerUpItem = 2
   If PowerUp > 40 and PowerUp <= 100 Then PowerUpItem = 3
   Select PowerUpItem
      Case 1 : Texture Object Index,4 : EndCase
      Case 2 : Texture Object Index,5 : EndCase
      Case 3 : Texture Object Index,6 : EndCase
      Case 4 : Texture Object Index,7 : EndCase
      Case Default : Color Object Index,rgb(255,255,255) : EndCase
   EndSelect
   PowerUpXPos#(Index) = AsteroidXPos#(AsteroidNumber)
   PowerUpYPos#(Index) = AsteroidYPos#(AsteroidNumber)
   PowerUpZPos#(Index) = AsteroidZPos#(AsteroidNumber)
   PowerUpIndex(Index) = PowerUpItem
   If MaxPowerUpIndex(1) < Index Then MaxPowerUpIndex(1) = Index 
EndIf

EndFunction
Rem -----------------------------------------------------------------------

Rem ---------------------------- Move Power Up ----------------------------
Function MovePowerUp()

For x = 1 to MaxPowerUpIndex(1)
   If PowerUpIndex(x) > 0
      PowerUpXpos#(x) = PowerUpXpos#(x)
      PowerUpYPos#(x) = PowerUpYPos#(x)-1
      PowerUpZpos#(x) = PowerUpZpos#(x)
      Position Object x,PowerUpXpos#(x),PowerUpYpos#(x),PowerUpZpos#(x)     
   EndIf
Next x

EndFunction
Rem -----------------------------------------------------------------------

Rem -------------------------- Delete Power up ----------------------------
Function DeletePowerUp()

For x = 1 to MaxPowerUpIndex(1)
   If PowerUpIndex(x) > 0
      If PowerUpYPos#(x) < MinDistance#(1)
         PowerUpIndex(x) = 0
         Hide Object x
         Delete Object x
         For y = 1 to MaxPowerUpIndex(1)
            If PowerUpIndex(y) = 1 Then MaxPowerUpIndex = y
         Next y
         MaxPowerUpIndex(1) = MaxPowerUpIndex
      EndIf
   EndIf
Next x

EndFunction
Rem -----------------------------------------------------------------------

Rem -------------------------- Destroy Asteroid ---------------------------
Function DestroyAsteroid(Index)

SoundIndex = 1

If AsteroidHealth(Index) <= 0
   MakeExplosion(Index)
   AsteroidHealth(Index) = 0
   AsteroidIndex(Index) = 0
   PlayerScore(1) = PlayerScore(1) + AsteroidType(Index)
   Hide Object Index
   Delete Object Index
   For m = 1 to MaxAsteroidIndex(1)
      If AsteroidIndex(m) = 1 Then MaxAsteroidIndex = m
   Next m
   MaxAsteroidIndex(1) = MaxAsteroidIndex
   PowerUp = rnd(9)
   If PowerUp = 9 Then PowerUp(Index)
   For m = 1 to MaxAsteroidSoundIndex(1)
      If AsteroidSoundIndex(m) = Index
         AsteroidSoundIndex(m) = 0
         Delete Sound m
         For n = 1 to MaxAsteroidSoundIndex(1)
            If AsteroidSoundIndex(n) > 0 Then MaxAsteroidSoundIndex = n
         Next n
         MaxAsteroidSoundIndex(1) = MaxAsteroidSoundIndex
      EndIf
   Next m
   GetSoundIndex:
   If Sound Exist(SoundIndex) = 1
      Inc SoundIndex
      Goto GetSoundIndex
   Else
      Load 3DSound "explode3.wav",SoundIndex
      Play Sound SoundIndex
      Position Sound SoundIndex,AsteroidXpos#(Index),AsteroidYpos#(Index),AsteroidZpos#(Index)
      ExplosionSoundIndex(SoundIndex) = Index
      If MaxExplosionSoundIndex(1) < SoundIndex Then MaxExplosionSoundIndex(1) = SoundIndex 
   EndIf
EndIf

EndFunction
Rem -----------------------------------------------------------------------

Rem ------------------------------ Explosion ------------------------------
Function MakeExplosion(Number)

Index = 1

GetIndexNumber:

If Object Exist(Index) = 1
   Inc Index
   Goto GetIndexNumber
Else
   Make Object Sphere Index,3
   ExplosionIndex(Index,1) = Index
   Ghost Object On Index
   ExplosionScale(Index) = 100
   ExplosionDelay(Index) = 2
   Texture Object Index,1
   Position Object Index,AsteroidXPos#(Number),AsteroidYPos#(Number),AsteroidZPos#(Number)
   If MaxExplosionIndex(1) < Index Then MaxExplosionIndex(1) = Index
   Plain = 1
   PlainNumber = 2
   GetPlain:
   If Object Exist(Plain) = 1  
      Inc Plain
      Goto GetPlain 
   Else
      If PlainNumber <= 5
         Make Object Plain Plain,rnd(1)+2,rnd(1)+2
         ExplosionIndex(Index,PlainNumber) = Plain
         Ghost Object On Plain
         Texture Object Plain,1
         XRotate Object Plain,rnd(180)
         YRotate Object Plain,rnd(180)
         ZRotate Object Plain,rnd(180)
         Position Object Plain,AsteroidXPos#(Number),AsteroidYPos#(Number),AsteroidZPos#(Number)
         If MaxPlainNumber(1) < Plain Then MaxPlainNumber(1) = Plain 
         Inc PlainNumber
         Goto GetPlain
      EndIf
   EndIf
EndIf

EndFunction
Rem -----------------------------------------------------------------------

Rem --------------------------- Finish Explosion ---------------------------
Function FinishExplosion()

For x = 1 to MaxExplosionIndex(1)
   If ExplosionDelay(x) = 0
      If ExplosionIndex(x,1) > 0
         ExplosionScale(x) = ExplosionScale(x) + 100
         ExplosionDelay(x) = 2
         For y = 1 to 5
            Scale Object ExplosionIndex(x,y),ExplosionScale(x),ExplosionScale(x),ExplosionScale(x)
            Scroll Object Texture ExplosionIndex(x,y),0.1,0.1
         Next y
      EndIf

      If ExplosionScale(x) > 2000
        If ExplosionIndex(x,1) > 0
            For y = 1 to 5
               Delete Object ExplosionIndex(x,y)
               ExplosionIndex(x,y) = 0
               For z = 1 to MaxExplosionIndex(1)
                  If ExplosionIndex(z,1) > 0 Then MaxExplosionIndex = z
               Next z
               MaxExplosionIndex(1) = MaxExplosionIndex
            Next y
            For m = 1 to MaxExplosionSoundIndex(1)
               If ExplosionSoundIndex(m) = x
                  ExplosionSoundIndex(m) = 0
                  Delete Sound m
                  For n = 1 to MaxExplosionSoundIndex(1)
                     If ExplosionSoundIndex(n) > 0 Then MaxExplosionSoundIndex = n
                  Next n
                  MaxExplosionSoundIndex(1) = MaxExplosionSoundIndex
               EndIf
            Next m
         EndIf   
      EndIf
   Else
      ExplosionDelay(x) = ExplosionDelay(x) - 1
   EndIf
Next x

EndFunction
Rem -----------------------------------------------------------------------

Rem ------------------------ Make Explosion Bitmap ------------------------
Function ExplosionBitmap()

Create Bitmap 1,256,256
Ink rgb(250,40,50),0
Box 0,0,255,255
For x = 0 to 100
   Ink rgb(250,40+(2*x),50),0
   Box x+20,x+20,230-x,230-x
Next x
Get Image 1,0,0,255,255
Delete Bitmap 1
Ink rgb(255,255,255),0

EndFunction
Rem -----------------------------------------------------------------------

Rem --------------------------- BackDrop Bitmap ---------------------------
Function BackDropBitmap()

Rem This needs be a small texture, or the game runs too slow
Create Bitmap 2,128,128
Ink rgb(250,230,50),0
For x = 1 to 200
   Dot rnd(127),rnd(127)
Next x
Get Image 2,0,0,127,127
Delete Bitmap 2
Ink rgb(255,255,255),0

EndFunction
Rem -----------------------------------------------------------------------

Rem --------------------------- Asteroid Bitmap ---------------------------
Function AsteroidBitmap()

Create Bitmap 3,16,16
Ink rgb(200,100,0),0
Box 0,0,15,15
Ink rgb(100,50,0),0
For x = 1 to 3
   Top = rnd(10)+1
   Left = rnd(10)+1
   Box Left,Top,Left+1,Top+1
Next x
Get Image 3,0,0,15,15
Delete Bitmap 3
Ink rgb(255,255,255),0

EndFunction
Rem -----------------------------------------------------------------------

Rem --------------------------- Power up Bitmap ---------------------------
Function PowerUpBitmap()

Create Bitmap 4,16,16
Ink rgb(20,50,150),0
Box 0,0,15,15
Ink rgb(255,255,255),0
Set Text Font "System"
Set Text Size 20
Center Text 8,8,"L"
Get Image 4,0,0,15,15
Delete Bitmap 4

Create Bitmap 5,16,16
Ink rgb(150,50,250),0
Box 0,0,15,15
Ink rgb(255,255,255),0
Set Text Font "System"
Set Text Size 20
Center Text 8,8,"N"
Get Image 5,0,0,15,15
Delete Bitmap 5

Create Bitmap 6,16,16
Ink rgb(150,250,150),0
Box 0,0,15,15
Ink rgb(255,255,255),0
Set Text Font "System"
Set Text Size 20
Center Text 8,8,"P"
Get Image 6,0,0,15,15
Delete Bitmap 6

Create Bitmap 7,16,16
Ink rgb(255,255,255),0
Box 0,0,15,15
Ink rgb(255,0,0),0
Box 0,8,15,8
Box 8,0,8,15
Get Image 7,0,0,15,15
Delete Bitmap 7

EndFunction
Rem -----------------------------------------------------------------------

Rem ----------------------------- Death Bitmap ----------------------------
Function DeathBitmap()

Create Bitmap 8,16,16
Ink rgb(255,0,0),0
Box 0,0,15,15
Get Image 8,0,0,15,15
Delete Bitmap 8
Ink rgb(255,255,255),0

EndFunction
Rem -----------------------------------------------------------------------

Rem ----------------------------- Instructions ----------------------------
Function Instructions()

PageOne:

PageOne = 0
PageTwo = 0

cls

repeat

DeleteButton()

Ink rgb(50,50,200),0
Box 280,50,390,100
Box 100,150,540,360

Ink rgb(255,255,255),0
Line 100,150,540,150
Line 540,150,540,360
Line 100,150,100,360
Line 100,360,540,360

Line 280,50,390,50
Line 390,50,390,100
Line 280,50,280,100
Line 280,100,390,100

Set Text Font "Comic Sans MS"
Set Text Size 20
Text 120,160,"Mouse"
Text 120,190,"Left Mouse Button"
Text 120,220,"Right Mouse Button"
Text 120,250,"Upkey"
Text 120,280,"Downkey"
Text 120,310,"Ctrl"
Text 120,340,"Escape"

Text 300,160,"Move cursor"
Text 300,190,"Fire laser"
Text 300,220,"Fire secondary weapon"
Text 300,250,"Speed up"
Text 300,280,"Slow down"
Text 300,310,"Change secondary weapon"
Text 300,340,"Quit"

Center Text 335,65,"Instructions"

Button(170,400,300,450,"Back")
Button(370,400,500,450,"Next")

For x = 1 to MaxButtonIndex(1)
   If ButtonIndex(x) = 1
      If MouseX() > ButtonLeft(x) and MouseX() < ButtonRight(x)
         If MouseY() >  ButtonTop(x) and MouseY() < ButtonBottom(x)
            Ink rgb(0,0,0),0
            If MouseClick() = 1
               If ButtonName$(x) = "Next" 
                  Repeat
                  Until MouseClick() = 0
                  PageOne = 1
               EndIf
               If ButtonName$(x) = "Back" 
                  PageTwo = 1
                  PageOne = 1
                  Repeat
                  Until MouseClick() = 0
               EndIf
            EndIf
         Else
            Ink rgb(255,255,255),0
         EndIf
      Else
         Ink rgb(255,255,255),0
      EndIf
      Set Text Font "Comic Sans MS"
      Set Text To Bold
      Set Text Size 25
      If ButtonName$(x) = "Back" Then Center Text 235,415,"Back"
      If ButtonName$(x) = "Next" Then Center Text 435,415,"Next Page"
   EndIf
Next x

sync
Until PageOne = 1

cls


repeat

DeleteButton()

Ink rgb(50,50,200),0
Box 280,50,390,100
Box 150,150,510,360

Ink rgb(255,255,255),0
Line 150,150,510,150
Line 510,150,510,360
Line 150,150,150,360
Line 150,360,510,360

Line 280,50,390,50
Line 390,50,390,100
Line 280,50,280,100
Line 280,100,390,100

Set Text Font "Comic Sans MS"
Set Text Size 20

Center Text 320,170,"Power Ups"
Center Text 335,65,"Instructions"

Ink rgb(20,50,150),0
Box 280,200,300,220
Ink rgb(255,255,255),0
Set Text Font "System"
Set Text Size 20
Center Text 290,205,"L"

Ink rgb(150,50,250),0
Box 280,230,300,250
Ink rgb(255,255,255),0
Set Text Font "System"
Set Text Size 20
Center Text 290,235,"N"

Ink rgb(150,250,150),0
Box 280,260,300,280
Ink rgb(255,255,255),0
Set Text Font "System"
Set Text Size 20
Center Text 290,265,"P"

Ink rgb(255,255,255),0
Box 280,290,300,310
Ink rgb(255,0,0),0
Box 280,297,300,303
Box 287,290,293,310

Ink rgb(255,255,255),0
Text 350,200,"Laser"
Text 350,230,"Pulsar"
Text 350,260,"Nuclear Bomb"
Text 350,290,"Health"

Button(170,400,300,450,"Back")
Button(370,400,500,450,"Previous")

For x = 1 to MaxButtonIndex(1)
   If ButtonIndex(x) = 1
      If MouseX() > ButtonLeft(x) and MouseX() < ButtonRight(x)
         If MouseY() >  ButtonTop(x) and MouseY() < ButtonBottom(x)
            Ink rgb(0,0,0),0
            If MouseClick() = 1
               If ButtonName$(x) = "Back" 
                  Repeat
                  Until MouseClick() = 0
                  PageTwo = 1
               EndIf
               If ButtonName$(x) = "Previous"
                  Repeat
                  Until MouseClick() = 0
                  Goto PageOne
               EndIf
            EndIf
         Else
            Ink rgb(255,255,255),0
         EndIf
      Else
         Ink rgb(255,255,255),0
      EndIf
      Set Text Font "Comic Sans MS"
      Set Text To Bold
      Set Text Size 25
      If ButtonName$(x) = "Back" Then Center Text 235,415,"Back"
      If ButtonName$(x) = "Previous" Then Center Text 435,415,"Previous Page"
   EndIf
Next x

sync
Until PageTwo = 1

EndFunction
Rem -----------------------------------------------------------------------

Rem ----------------------------- Death Sound -----------------------------
Function DeathSound()

For x = 1 to MaxDeathSoundIndex(1)
   If DeathSoundTimer(x) > 0 
      DeathSoundTimer(x) = DeathSoundTimer(x) - 1
   Else
      If DeathSoundIndex(x) > 0 
         Delete Sound x
         DeathSoundIndex(x) = 0
         For n = 1 to MaxDeathSoundIndex(1)
            If DeathSoundIndex(n) > 0 Then MaxDeathSoundIndex = n
         Next n
         MaxDeathSoundIndex(1) = MaxDeathSoundIndex
      EndIf
      If DeathSoundTimer(x) <= 48
         Texture BackDrop 2
      EndIf         
   EndIf
Next x

EndFunction
Rem -----------------------------------------------------------------------