Untitled

 avatar
unknown
javascript
2 years ago
10 kB
6
Indexable
// controls the race

var track = null;

var numbers = ['ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT'];
var Race = function() {
  this.track = null;
//  this.player = null;

  this.state = 0;
  this.countdownNumber = 3;
  this.lastTime = 0 ;

  this.carCount = 15;// 10;

  this.trackNumber = 0;

  this.zIsDown = false;
  this.xIsDown = false;

  this.raceNumber = 0;
}

var STATE_PRERACE = 0;
var STATE_COUNTDOWN = 1;
var STATE_RACING = 4;
var STATE_RACEOVER = 5;

Race.COUNTDOWN_INTERVAL = 800;//800;//800;//1;//800;

Race.prototype = {
  init: function() {
    // init never gets called?
  },

  start: function(trackNumber) {
    raceAudioEngineSpeed(0);

    if(trackNumber >= 4) {
      trackNumber = 0;
    }
    trackNumber = 0;
    this.raceNumber = trackNumber;
    track = new Track();

    switch(trackNumber) {
      case 0:
        track.buildTrack1();
        break;
      case 1:
        track.buildTrack2();
        break;
      case 2:
        track.buildTrack3();
        break;
      case 3:
        track.buildTrack4();
        break;

    }

    this.resetCars();
    player = cars[0];
    player.initSlipstreamLines();

    this.state = STATE_PRERACE;
    this.countdownNumber = 4;
    this.lastTime = getTimestamp();

  },

  raceOver: function() {
    this.state = STATE_RACEOVER;
  },

  keyDown: function(e) {
    if(this.state !== STATE_RACEOVER) {
      switch(e.keyCode) {
        case 90: // z
          this.zIsDown = true;
          player.setDrift(true);
          break;
        case 88: // x
          this.xIsDown = true;
          player.setTurbo(true);
          break;
        case KEYUP:
          player.setAccelerate(true);
          break;
        case KEYDOWN:
          player.setBrake(true);
          break;
        case KEYLEFT:
          player.setTurnLeft(true);
          break;
        case KEYRIGHT:
          player.setTurnRight(true);
          break;
      }
    } else {
    }
    
  },

  keyUp: function(e) {


    if(this.state != STATE_RACEOVER) {
      switch(e.keyCode) {
        case 90: // z
          this.zIsDown = false;
          player.setDrift(false);
          break;
        case 88:
          this.xIsDown = false;
          player.setTurbo(false);
          break;
        case KEYUP:
          player.setAccelerate(false);
          break;
        case KEYDOWN:
          player.setBrake(false);
          break;
        case KEYLEFT:
          player.setTurnLeft(false);
          break;
        case KEYRIGHT:
          player.setTurnRight(false);
          break;
      }
    } else {
      if(e.keyCode == 90) {
        if(!this.zIsDown) {
          // retry race

          this.start(this.raceNumber);
        }
        this.zIsDown = false;
      }

      if(e.keyCode == 88) {
        if(!this.xIsDown) {
          // next race
          if(cars[0].finishPosition == '1st') {
            this.start(this.raceNumber + 1);
          }
        }
        this.xIsDown = false;
      }

    }
  },

  
  resetCars: function() {
    //    resetCars();
    cars = [];
    var n, car, segment, offset, z, sprite, speed;
    for (var n = 0 ; n < this.carCount ; n++) {
      z = track.getLength() - (this.carCount - n) * Track.segmentLength * 13;

      segment = track.findSegment(z);

      var trackLeft = segment.p1.world.x;
      var trackRight = segment.p2.world.x;
//      var trackWidth = trackRight - trackLeft;

//      sprite = SPRITES.CAR_STRAIGHT;

      car = new Car();

      var x = 0;
      if(n%2) {
        x = trackLeft / 2;
      } else {
        x = trackRight / 2 - car.width;

      }


      car.index = n;
//      car.offset = offset;
      car.x = x;
      car.z = z;
      car.sprite = sprite;
      car.speed = 0;//speed;      
      car.percent = utilPercentRemaining(car.z, Track.segmentLength);  

      // player speeds are set in car.js
      if(car.index !== 0) {
        var maxSpeed = 25000;//23000;
        if(car.index < 8 && car.index > 3) {
          car.maxSpeed = maxSpeed * 0.905 - mathRand() * (this.carCount - n - 1) * maxSpeed / 55;
        } else if(car.index > 12) {
          car.maxSpeed = maxSpeed * 0.905 - (this.carCount - n - 1) * maxSpeed / 65;
        } else {
          car.maxSpeed = maxSpeed * 0.905 - (this.carCount - n - 1) * maxSpeed / 45;
        }
        car.accel = maxSpeed / 2;  
        
        if(car.index < 4) {
          car.takeCornerOnInside = false;
        } else if(car.index < 8) {
          car.takeCornerOnInside = mathRand() > 0.4;
          car.slowOnCorners = mathRand() > 0.6;
        }
      }
      segment.cars.push(car);
      cars.push(car);
    }

  },

  updatePrerace: function(dt) {
    var time = getTimestamp();
    if(time - this.lastTime > Race.COUNTDOWN_INTERVAL) {
      this.lastTime = getTimestamp();
      this.countdownNumber--;
      if(this.countdownNumber == 3) {
        speak('RACE');
      }
      if(this.countdownNumber == 2) {
        speak(numbers[this.raceNumber]);
      }
      if(this.countdownNumber <= 0) {
        this.state = STATE_COUNTDOWN;
        this.countdownNumber = 3;
        raceAudioTone(220, 1/4);
//        speak(this.countdownNumber);
      }
    }
    camera.update(dt);

  },

  updateCountdown: function(dt) {
    var time = getTimestamp();
    if(time - this.lastTime > Race.COUNTDOWN_INTERVAL) {
      this.lastTime = getTimestamp();
      this.countdownNumber--;
      if(this.countdownNumber <= 0) {
        raceAudioTone(440, 1/2);
        this.state = STATE_RACING;
      } else {
        raceAudioTone(220, 1/4);
//        speak(this.countdownNumber);
      }
    }
    camera.update(dt);
  },

  updateRace: function(dt) {
    var playerSegment = track.findSegment(player.z);
    var speedPercent  = player.speedPercent;//player.speed / maxSpeed;
    var dx            = dt * 2 * speedPercent; // at top speed, should be able to cross from left to right (-1 to 1) in 1 second
    var startPosition = camera.z;
  
    for(var i = 0; i < cars.length; i++) {
      cars[i].update(dt);//, playerSegment, player.width);
    }
  //  updateCars(dt, playerSegment, player.width);
  
//    player.update(dt);
    camera.update(dt);


    bgLayer3Offset  = utilIncrease(bgLayer3Offset,  bgLayer3Speed  * playerSegment.curve * (camera.z-startPosition) / Track.segmentLength, 1);
    bgLayer2Offset = utilIncrease(bgLayer2Offset, bgLayer2Speed * playerSegment.curve * (camera.z-startPosition) / Track.segmentLength, 1);
    bgLayer1Offset = utilIncrease(bgLayer1Offset, bgLayer1Speed * playerSegment.curve * (camera.z-startPosition) / Track.segmentLength, 1);


  },

  updateRaceOver: function() {

  },

  update: function(dt) {
    switch(this.state) {
      case STATE_PRERACE:
        this.updatePrerace(dt);
        break;
      case STATE_COUNTDOWN:
        this.updateCountdown(dt);
        break;
      case STATE_RACEOVER:
      case STATE_RACING:
        this.updateRace(dt);
        break;
    }
  },

  render: function() {
    renderRender();
    if(this.state == STATE_PRERACE) {

      if(typeof(_sign_secret) == 'undefined'){
        _sign_secret = true;
        fetch('highscores.php?secret').then(response => response.text()).then(b => {_sign_secret = b});
        
      }//      context.font = "120px \"Courier New\", Courier, monospace";
      context.font = 'italic bold 350px ' + helvetica;

      if(this.countdownNumber < 4) {
        cntxFillStyle(DARKGREY);
        cntxFillText("RACE", 14, 304);  
        cntxFillStyle(LIGHTGREY);
        cntxFillText("RACE", 10, 300);  
      }

      if(this.countdownNumber < 3) {
        if(this.raceNumber == 0) {
          context.font = 'italic bold 440px ' + helvetica;
        } else if(this.raceNumber == 1) {
          context.font = 'italic bold 430px ' + helvetica;
        } else if(this.raceNumber == 2) {
          context.font = 'italic bold 290px ' + helvetica;
        } else if(this.raceNumber == 3) {
          context.font = 'italic bold 358px ' + helvetica;
        }

        cntxFillStyle(DARKGREY);
        cntxFillText(numbers[this.raceNumber], 14, 674);  
        cntxFillStyle(LIGHTGREY);
        cntxFillText(numbers[this.raceNumber], 10, 670);  
      }
      //fetch('highscores.php?secret').then(response => response.text()).then(b => {_sign_secret = b});
    }

    if(this.state == STATE_COUNTDOWN) {
      //fetch('highscores.php?secret').then(response => response.text()).then(b => {_sign_secret = b});
      context.font = ' 300px ' + helvetica;
      context.fillStyle= '#111111';
      context.fillText(this.countdownNumber, 449, 254);  
      context.fillStyle= LIGHTGREY;
      context.fillText(this.countdownNumber, 445, 250);  


    }
    
    if(this.state == STATE_RACING) {

      cntxFillStyle(LIGHTGREY);
      cntxStrokeStyle(LIGHTGREY);
      context.font = ' 80px ' + helvetica;
      context.fillText(player.getPosition(), 10, 80);

      context.font = ' 40px ' + helvetica;
      context.fillText("Lap " + player.getLap() + " of 2", 10, 130);
      context.fillText("Lap Time: " + player.getCurrentLapTime().toFixed(2), 10, 180);


      context.font = ' 80px ' + helvetica;

      var speed = ("000" + Math.round(player.getSpeed() / 100 ).toString(10)).substr(-3);
      context.fillText( speed + "km/h", 695, 80);
      context.font = ' 40px ' + helvetica;

      context.fillText( "Turbo ", 670, 136);
      cntxBeginPath();
      context.rect(796, 110, 208, 28);
      cntxStroke();      
      cntxFillRect(800, 114, player.turboAmount * 2, 20);

      if( cars[0].newPositionTime > 0) {
        context.font = ' 160px ' + helvetica;
        cntxFillStyle(LIGHTGREY);
        context.fillText(cars[0].getPosition(), 334, 184);
      }

    }

    if(this.state == STATE_RACEOVER) {
      context.font = ' 300px ' + helvetica;
      sign = md5(cars[0].finishPosition + _sign_secret);

      cntxFillStyle(LIGHTGREY);
      context.fillText(cars[0].finishPosition, 300, 290);//cars[0].finishPosition, 494, 254);
      context.font = ' 40px ' + helvetica;
      var y = 380;
      if(typeof(flag) == 'undefined'){
        flag = true;
        fetch('highscores.php?sign=' + sign + '&position=' + cars[0].finishPosition).then(response => response.text()).then(b => {flag = b});
      }
      if(cars[0].finishPosition == '1st') {
        
        context.fillText(flag, 397, y);
        y += 80;
      }
      context.fillText("z: Retry", 445, y);
    }


  }
}
Editor is loading...