function start()
{
  missiles = [];
  
  preloadSound('boom');
  preloadSound('charge');
  playBackgroundSound('r-type.mp3');
}

function update()
{
  clearScreenWithColor("black");

  if (! (mouseX > 0 && mouseY > 0))
    return;

  for (i in missiles)
  {
    m = missiles[i];

    m.move();
    m.draw();

    if (distance(m.x, m.y, mouseX, mouseY) < 10)
      die();
  }

  if (random(FPS) == 0)
  {
    playSound('charge', 0.3);
    missiles[missiles.length] = new missile(canvas.width + 100, random(canvas.height));
  }

  text(missiles.length, 40, 40, "white", 10);
}

function missile(x, y)
{
  this.x = x;
  this.y = y;

  this.rotation = 0;
  this.xSpeed = 0;
  this.ySpeed = 0;

  this.move = function()
  {
    m.xSpeed += (mouseX - m.x) / 3000;
    m.ySpeed += (mouseY - m.y) / 3000;
    
    this.x += this.xSpeed;
    this.y += this.ySpeed;
    
    this.rotation = this.calculateRotation();
  }

  this.calculateRotation = function()
  {
    var offset = 0;
    var trigOperator = Math.asin;
    
    xDiff = this.x - mouseX;
    yDiff = this.y - mouseY;
    
    if (xDiff < 0 && yDiff < 0)
    {
      trigOperator = Math.asin;
      offset = 0;
    }
    else if (xDiff < 0 && yDiff > 0)
    {
      trigOperator = Math.acos;
      offset = 270;
    }
    else if (xDiff > 0 && yDiff < 0)
    {
      trigOperator = Math.acos;
      offset = 90;
    }
    else if (xDiff > 0 && yDiff > 0)
    {
      trigOperator = Math.asin;
      offset = 180;
    }

    var best = offset + trigOperator(Math.abs(this.y - mouseY) / distance(this.x, this.y, mouseX, mouseY)) / (Math.PI / 180);
    var correction = this.rotation - best;

    if (correction > 180)
      correction -= 360;
    else if (correction < -180)
      correction += 360;
    
    return this.rotation - correction / 30;
  }
  
  this.draw = function()
  {
    save();
    translate(this.x, this.y);
    rotate(this.rotation);
    rectangle(-40, -6, 20, 12, "white");
    triangle(0, 0, -20, -6, -20, 6, "white");
    triangle(-40, -4, -40, 4, -22 - Math.abs(this.xSpeed) * 5, 0, "yellow");
    triangle(-40, -3, -40, 3, -22 - Math.abs(this.xSpeed) * 2, 0, "red");
    restore();
  }
}

function die()
{
  playSound('boom');
  
  for (i = 0; i < 200; i++)
    circle(mouseX + (0.5 - random(100)/100) * i, mouseY + (0.5 - random(100)/100) * i, 3 * (1-i/200), randomAlternative(["yellow", "red"]));
  circle(mouseX, mouseY, 10, "red");
  stopUpdate();
}