Example #1
0
  def load(self, settings):
    if self.music != None:
      self.music.Pause()
    self.settings = settings
   
    self.laps   = self.settings.nLaps
    self.stats  = {}
    self.countdown = 4
    self.countsound = self.countdown
    self.gameStarted = False
    self.gameOver = False
 
    self.nPlayersRacing = self.settings.nPlayers
 
    self.freeAINames =  list(GameSettings.AI_NAMES)
    random.shuffle(self.freeAINames)
    
    track = Track(self.settings.track)
    self.vehicleList = []

    frame = track.GetFrame(-30.0)
    self.startOrientation = Matrix(frame.position, frame.up, frame.fw)
    
    forwardMat = Matrix(ORIGIN, -PI/2.0, X)
    
    startFrame = track.GetFrame(0.0)\
       
    finishLineTransform = Matrix(40, 8, 1) * Matrix(startFrame.position+startFrame.up*0.1+startFrame.fw*-3, startFrame.fw, -startFrame.up)
    self.Add(Quad('FinishLine','FinishLine2.png',finishLineTransform))
    finishLineTransform = Matrix(6.35, 4.0, 4.0) * Matrix(startFrame.position+startFrame.up*0.1+startFrame.fw*-3, startFrame.up, startFrame.fw)
    self.Add(StaticModel('FinishLine','FinishLine.x',finishLineTransform))

    self.rings = []
    self.accuDelta = 0.
    self.ringStartingHue = 0.0


    for x in [200., 2200.]:
      for i in xrange(64):
        frame = track.GetFrame(x+10*i)
        tx = Matrix(3.0, 3.0, 6.0) * Matrix(frame.position, frame.up, frame.fw)
        ring = Ring("Ring", "Ring1.x", "Ring1.x", tx)
        self.rings.append(ring)
        self.Add(ring)
    self.track = self.Add(track)
      
    
    self.skybox = SkyBox()

    self.interfaces = []
    viewports = self.SetupViewports(self.settings.nPlayers)
    
    self.playerVehicles = [self.AddVehicle(player) for player in self.settings.players] 

    for i in range(self.settings.nAIs):
      self.AddVehicle(None)

    for i,vehicle in enumerate(self.playerVehicles):
      pi = PlayerInterface(self, vehicle, viewports[i])
      pi.AddRenderable(self.skybox)
      pi.AddRenderable(self.scene)
      self.interfaces.append(pi)

    self.SetupInputMapping()
       
    self.meteorManager = MeteorManager(self)
    
    self.lastMeteorTime = 0
    
    self.countFx = cpp.SoundFx();
    self.countFx.isLooping  = False
    self.countFx.is3D     = False
    self.countFx.isPaused = True
    self.countFx.volume = 20
    game().sound.sound.LoadSoundFx("Countdown.wav", self.countFx)

##    self.goFx = cpp.SoundFx();
##    self.goFx.isLooping  = False
##    self.goFx.is3D     = False
##    self.goFx.isPaused = True
##    game().sound.sound.LoadSoundFx("Go.wav", self.goFx)

    if self.music is None:
      self.music = Music(track.music, volume=20)
      self.music.Pause()
        
    self.boostbeams = []
    for i in xrange(16):
      beam = Model('StealBeam%d'%i, 'boostStealBeam.x', None, IDENTITY)
      beam.active = False
      beam.graphics.m_texOffset.v = random.random()
      self.boostbeams.append(self.Add(beam))
    
    game().io.LoadTexture(Config.UI_TEXTURE)
    
    game().time.Zero()
    self.loaded = True
Example #2
0
class GameState(State):
  def __init__(self, settings):
    State.__init__(self)
    self.loaded = False
    self.music = None
    self.load(settings)

 

  def load(self, settings):
    if self.music != None:
      self.music.Pause()
    self.settings = settings
   
    self.laps   = self.settings.nLaps
    self.stats  = {}
    self.countdown = 4
    self.countsound = self.countdown
    self.gameStarted = False
    self.gameOver = False
 
    self.nPlayersRacing = self.settings.nPlayers
 
    self.freeAINames =  list(GameSettings.AI_NAMES)
    random.shuffle(self.freeAINames)
    
    track = Track(self.settings.track)
    self.vehicleList = []

    frame = track.GetFrame(-30.0)
    self.startOrientation = Matrix(frame.position, frame.up, frame.fw)
    
    forwardMat = Matrix(ORIGIN, -PI/2.0, X)
    
    startFrame = track.GetFrame(0.0)\
       
    finishLineTransform = Matrix(40, 8, 1) * Matrix(startFrame.position+startFrame.up*0.1+startFrame.fw*-3, startFrame.fw, -startFrame.up)
    self.Add(Quad('FinishLine','FinishLine2.png',finishLineTransform))
    finishLineTransform = Matrix(6.35, 4.0, 4.0) * Matrix(startFrame.position+startFrame.up*0.1+startFrame.fw*-3, startFrame.up, startFrame.fw)
    self.Add(StaticModel('FinishLine','FinishLine.x',finishLineTransform))

    self.rings = []
    self.accuDelta = 0.
    self.ringStartingHue = 0.0


    for x in [200., 2200.]:
      for i in xrange(64):
        frame = track.GetFrame(x+10*i)
        tx = Matrix(3.0, 3.0, 6.0) * Matrix(frame.position, frame.up, frame.fw)
        ring = Ring("Ring", "Ring1.x", "Ring1.x", tx)
        self.rings.append(ring)
        self.Add(ring)
    self.track = self.Add(track)
      
    
    self.skybox = SkyBox()

    self.interfaces = []
    viewports = self.SetupViewports(self.settings.nPlayers)
    
    self.playerVehicles = [self.AddVehicle(player) for player in self.settings.players] 

    for i in range(self.settings.nAIs):
      self.AddVehicle(None)

    for i,vehicle in enumerate(self.playerVehicles):
      pi = PlayerInterface(self, vehicle, viewports[i])
      pi.AddRenderable(self.skybox)
      pi.AddRenderable(self.scene)
      self.interfaces.append(pi)

    self.SetupInputMapping()
       
    self.meteorManager = MeteorManager(self)
    
    self.lastMeteorTime = 0
    
    self.countFx = cpp.SoundFx();
    self.countFx.isLooping  = False
    self.countFx.is3D     = False
    self.countFx.isPaused = True
    self.countFx.volume = 20
    game().sound.sound.LoadSoundFx("Countdown.wav", self.countFx)

##    self.goFx = cpp.SoundFx();
##    self.goFx.isLooping  = False
##    self.goFx.is3D     = False
##    self.goFx.isPaused = True
##    game().sound.sound.LoadSoundFx("Go.wav", self.goFx)

    if self.music is None:
      self.music = Music(track.music, volume=20)
      self.music.Pause()
        
    self.boostbeams = []
    for i in xrange(16):
      beam = Model('StealBeam%d'%i, 'boostStealBeam.x', None, IDENTITY)
      beam.active = False
      beam.graphics.m_texOffset.v = random.random()
      self.boostbeams.append(self.Add(beam))
    
    game().io.LoadTexture(Config.UI_TEXTURE)
    
    game().time.Zero()
    self.loaded = True
  
  def BoostStealEvent(self, stealer, stealee, tx):
    for b in self.boostbeams:
      if b.active: continue
      b.active = True
      b.graphics.visible = True
      b.transform = tx
      b.graphics.m_texOffset.v += game().time.game_delta * -0.5 / game().time.RESOLUTION
      return
      
  def AddVehicle(self, player = None):
    if player and game().debug: print vars(player)
    
    n = len(self.vehicleList)    
    x = (n % 3 - 1)*15
    z = ((n / 3))*-15
    
    vehicle    = self.Add(Vehicle(
      player and player.name or self.freeAINames.pop(),    
      self.track, 
      Matrix(Point3(x, 7, z)) * self.startOrientation, 
      player and player.textureId or self.settings.RandomTextureId()
    ))
    vehicle.finishPlace = -1
    vehicle.lapBugCount = 0
    vehicle.isAI = player==None
    self.Add(Shadow(vehicle))
    self.vehicleList.append(vehicle)
    vehicle.isShutoff = True
    vehicle.Brake(1)
    if player:
      vehicle.sound.priority = 200
      PlayerBehavior(vehicle)
      vehicle.Backwards = False #???
    else:
      AIBehavior(vehicle, self.track, self)
    
    return vehicle                
      

  def SetupViewports(self, nPlayers):  
    w = game().graphics.width
    h = game().graphics.height
    
    w2 = w/2
    h2 = h/2
    if nPlayers==1:
      return [(0,0,w,h)]
    elif nPlayers==2:
      return [
        (0,   0,  w, h2),
        (0,   h2, w, h2),
      ]
    elif nPlayers>2:
      return [
        (0,   0,  w2, h2),
        (w2,  0,  w2, h2),
        (0,   h2, w2, h2),
        (w2,  h2, w2, h2),
      ]
      
  def SetupInputMapping(self):
    mappings = []
    
    for mapping in self.settings.debugMappings:
      mappings.append(mapping(None))
        
    for i,player in enumerate(self.settings.players):
      mappings.append(player.mapping(self.interfaces[i]))
      
    if self.settings.nPlayers==1 and self.settings.players[0].mapping != Keyboard1Mapping:
      mappings.append(Keyboard1Mapping(self.interfaces[0]))
      
    self.mapping = GameMapping(mappings)
    
  
  
  def Tick(self, time):
    delta = float(time.game_delta) / time.RESOLUTION
    self.countdown = self.countdown - delta
    if self.gameStarted == False:
      if math.ceil(self.countdown) < self.countsound:
        self.countsound = self.countsound - 1;
        if self.countdown > 0 and self.countdown <= 3:
          game().sound.sound.PlaySoundFx(self.countFx)
        #if self.countsound == 0:
        # game().sound.sound.PlaySoundFx(self.goFx)
        
    if self.gameStarted == False and self.countdown <=0:
      self.music.Unpause()
      self.gameStarted = True
      for vehicle in self.vehicleList:
        vehicle.isShutoff = False
        vehicle.Brake(0)
        self.stats.setdefault(vehicle, []).append(game().time.get_seconds())
        
      for i in range(CONSTS.NUM_METEORS):
        self.meteorManager.spawnRandom()

        

    for b in self.boostbeams:
      b.active = False
      b.graphics.visible = False
    
    # int SetOrientation3D(const Point3& listenerPos, const Vector3& listenerVel, const Vector3& atVector, const Vector3& upVector); //For 3D sound
    if len(self.interfaces) > 0:
      for i,interface in enumerate(self.interfaces):
        cam = interface.view.camera
        game().sound.sound.SetOrientation3DB(cam.GetPosition(), Point3(0,0,0), cam.GetLookAt(), cam.GetUp(), i, len(self.interfaces))

      #cam = self.interfaces[0].view.camera
      #---------------------------------------------------
      #game().sound.sound.SetOrientation3D(cam.GetPosition(), Point3(0,0,0), cam.GetLookAt(), cam.GetUp())
      
    
    _time.sleep(CONSTS.SLEEP_TIME)
    
    self.vehicleList.sort(key = lambda vehicle:vehicle.trackpos, reverse=True)
    
    for place,vehicle in enumerate(self.vehicleList):
      vehicle.place = place+1
      vehicle.lapRatio = vehicle.lapcount <= self.laps and vehicle.trackpos / self.track.dist % 1.0 or 1.0
    
    for interface in self.interfaces:
      interface.Tick(time)
      game().graphics.views.append(interface.view)
      game().graphics.views.append(interface.hud)
      
    if self.gameStarted:
      self.handleBoostStealing(float(time.game_delta)/time.RESOLUTION)
    
    if (not self.gameOver) and CONSTS.AIMED_METEOR_INTERVAL and self.gameStarted:
      self.lastMeteorTime += time.game_delta
      if self.lastMeteorTime > CONSTS.AIMED_METEOR_INTERVAL*time.RESOLUTION:
        self.lastMeteorTime = 0
        self.meteorManager.spawnTargeted(random.choice(self.vehicleList))
    
    self.meteorManager.Tick(time)
    
    self.accuDelta += delta
    
    if self.accuDelta>0.02:
      self.ringStartingHue = (self.ringStartingHue + self.accuDelta*5) % 1.0
      self.accuDelta-=0.1

      h = self.ringStartingHue
      
      for ring in self.rings:
        rgb = colorsys.hsv_to_rgb(h, .8, 0.5)
        ring.graphics.setTint(Vector4(rgb[0],rgb[1],rgb[2],1.0))
        h=(h+0.05)%1.0
  

    
    State.Tick(self, time)
    
    
  def LapEvent(self, vehicle, lap):
    if vehicle.lapBugCount < lap:
      vehicle.lapBugCount+=1
      if lap != 1:
        self.stats.setdefault(vehicle, []).append(game().time.get_seconds())
      
    
    if lap == self.laps+1:
      vehicle.finishPlace = vehicle.place
      if not vehicle.isAI:
        self.nPlayersRacing-=1
        if self.nPlayersRacing == 0:
          self.gameOver = True
          game().PushState(GameEndState(self.stats, self))
        
      vehicle.Brake(1)
      vehicle.isShutoff = True
      
    
  def ReloadConstsEvent(self):
    game().config.read()
    game().event.ReloadedConstsEvent()
    
  def PauseEvent(self):
    game().PushState(PauseMenuState())
    
  def KeyPressedEvent(self, key):
    if key == KEY.HOME:
      game().simspeed = 1.0
      
  def ObstacleAheadEvent(self, vehicleId, obstacleId):
    vehicle = self.entities[vehicleId]
    obstacle = self.entities[obstacleId]
    vehicle.obstacles.append(obstacle)
    
  def handleBoostStealing(self, delta):
    stealAmount = CONSTS.STEALING_SPEED*delta
    if stealAmount < 0.0001:
      #print "must be paused, no boost"
      return
    for i in range(len(self.vehicleList)-1):
      a = self.vehicleList[i]
      for j in range(i+1, len(self.vehicleList)):
        b = self.vehicleList[j]
        ap = a.physics.GetPosition()
        bp = b.physics.GetPosition()
        
        if length(ap-bp) > CONSTS.MAX_STEALING_DISTANCE: continue
        #possible stealing for one of the cars
        
        atx = a.physics.GetTransform()
        btx = b.physics.GetTransform()
        
        def steal(stealer, stealee, vec):
          
          size = 0.2
          if stealee.boostFuel > stealAmount and stealer.boostFuel + stealAmount < 5:
            #actually take boost
            stealer.boostFuel += stealAmount
            stealee.boostFuel -= stealAmount
            size = 1.0
            
          beamTransform = Matrix(size, size, length(vec)) * Matrix(stealer.physics.GetPosition(), Y, vec)
          game().event.BoostStealEvent(stealer, stealee, beamTransform)  
          
        if dot(mul0(atx, Z), normalized(bp-ap)) > 0.5:  steal(a, b, bp-ap)
        if dot(mul0(btx, Z), normalized(ap-bp)) > 0.5:  steal(b, a, ap-bp)
                    
  def Release(self):
    self.loaded = False
    self.meteorManager.Release()
    del self.meteorManager
    
    for i in self.entities.values():
      self.Remove(i)
    del self.track
    
    
  def Activate(self):
    State.Activate(self)
    if self.gameStarted:
      pass
      self.music.Unpause()
    if game().debug:
      print "Activate game state"

  def Deactivate(self):
    State.Deactivate(self) 
    
  def Pop(self):
    self.Release()
    self.music.Pause()
    self.vehicleList = []
    self.stats = {}