示例#1
0
    def run(self, ticks):
        SceneClient.run(self, ticks)
        self.time += ticks / 50.0
        self.counter += ticks

        if self.offset != None:
            self.offset -= ticks / 20000.0
        if self.pauseScroll != None:
            self.pauseScroll += ticks / 20000.0

        if self.counter > 5000 and self.taunt:
            #self.taunt.setVolume(self.engine.config.get("audio", "guitarvol"))
            self.taunt.setVolume(self.engine.config.get(
                "audio", "SFX_volume"))  #MFH - sound effect level
            self.taunt.play()
            self.taunt = None

        #MFH - add counter here to play another crowd cheer before the one playing ends for an endless cheering loop
        if self.engine.data.cheerSoundFound > 0 and self.resultCheerLoop > 0:
            if self.resultCheerLoop == 2 or (
                    self.resultCheerLoop == 1
                    and self.engine.data.cheerSoundFound == 2):
                self.cheerLoopCounter += 1
                if self.cheerLoopCounter >= self.cheerLoopDelay:
                    self.cheerLoopCounter = 0
                    self.engine.data.crowdSound.play()
  def run(self, ticks):
    SceneClient.run(self, ticks)

    if not self.wizardStarted:
      self.wizardStarted = True

      if not self.songName:
        while True:
          self.libraryName, self.songName = \
            Dialogs.chooseSong(self.engine, \
                               selectedLibrary = Config.get("game", "selected_library"),
                               selectedSong    = Config.get("game", "selected_song"))
        
          if not self.songName:
            self.session.world.finishGame()
            return

          Config.set("game", "selected_library", self.libraryName)
          Config.set("game", "selected_song",    self.songName)
          
          info = Song.loadSongInfo(self.engine, self.songName, library = self.libraryName)
          d = Dialogs.chooseItem(self.engine, info.difficulties,
                                 _("Choose a difficulty:"), selected = self.player.difficulty)
          if d:
            self.player.difficulty = d
            break
      else:
        info = Song.loadSongInfo(self.engine, self.songName, library = self.libraryName)

      # Make sure the difficulty we chose is available
      if not self.player.difficulty in info.difficulties:
        self.player.difficulty = info.difficulties[0]
        
      self.session.world.deleteScene(self)
      self.session.world.createScene("GuitarScene", libraryName = self.libraryName, songName = self.songName)
示例#3
0
    def run(self, ticks):
        SceneClient.run(self, ticks)
        pos = self.getSongPosition()

        # update song
        if self.song:
            # update stage
            self.stage.run(pos, self.guitar.currentPeriod)

            if self.countdown <= 0 and not self.song.isPlaying() and not self.done:
                self.goToResults()
                return

            if self.autoPlay:
                notes = self.guitar.getRequiredNotes(self.song, pos)
                notes = [note.number for time, note in notes]

                changed = False
                held = 0
                for n, k in enumerate(KEYS):
                    if n in notes and not self.controls.getState(k):
                        changed = True
                        self.controls.toggle(k, True)
                    elif not n in notes and self.controls.getState(k):
                        changed = True
                        self.controls.toggle(k, False)
                    if self.controls.getState(k):
                        held += 1
                if changed and held:
                    self.doPick()

            self.song.update(ticks)
            if self.countdown > 0:
                self.guitar.setBPM(self.song.bpm)
                self.countdown = max(self.countdown - ticks / self.song.period, 0)
                if not self.countdown:
                    self.engine.collectGarbage()
                    self.song.setGuitarVolume(self.guitarVolume)
                    self.song.setBackgroundVolume(self.songVolume)
                    self.song.setRhythmVolume(self.rhythmVolume)
                    self.song.play()

        # update board
        if not self.guitar.run(ticks, pos, self.controls):
            # done playing the current notes
            self.endPick()

        # missed some notes?
        if self.guitar.getMissedNotes(self.song, pos) and not self.guitar.playedNotes:
            self.song.setGuitarVolume(0.0)
            self.player.streak = 0

        # late pick
        if self.keyBurstTimeout is not None and self.engine.timer.time > self.keyBurstTimeout:
            self.keyBurstTimeout = None
            notes = self.guitar.getRequiredNotes(self.song, pos)
            if self.guitar.controlsMatchNotes(self.controls, notes):
                self.doPick()
示例#4
0
  def run(self, ticks):
    SceneClient.run(self, ticks)
    pos = self.getSongPosition()

    # update song
    if self.song:
      # update stage
      self.stage.run(pos, self.guitar.currentPeriod)

      if self.countdown <= 0 and not self.song.isPlaying() and not self.done:
        self.goToResults()
        return

      if self.autoPlay:
        notes = self.guitar.getRequiredNotes(self.song, pos)
        notes = [note.number for time, note in notes]

        changed = False
        held = 0
        for n, k in enumerate(KEYS):
          if n in notes and not self.controls.getState(k):
            changed = True
            self.controls.toggle(k, True)
          elif not n in notes and self.controls.getState(k):
            changed = True
            self.controls.toggle(k, False)
          if self.controls.getState(k):
            held += 1
        if changed and held:
          self.doPick()

      self.song.update(ticks)
      if self.countdown > 0:
        self.guitar.setBPM(self.song.bpm)
        self.countdown = max(self.countdown - ticks / self.song.period, 0)
        if not self.countdown:
          self.engine.collectGarbage()
          self.song.setGuitarVolume(self.guitarVolume)
          self.song.setBackgroundVolume(self.songVolume)
          self.song.setRhythmVolume(self.rhythmVolume)
          self.song.play()

    # update board
    if not self.guitar.run(ticks, pos, self.controls):
      # done playing the current notes
      self.endPick()

    # missed some notes?
    if self.guitar.getMissedNotes(self.song, pos) and not self.guitar.playedNotes:
      self.song.setGuitarVolume(0.0)
      self.player.streak = 0

    # late pick
    if self.keyBurstTimeout is not None and self.engine.timer.time > self.keyBurstTimeout:
      self.keyBurstTimeout = None
      notes = self.guitar.getRequiredNotes(self.song, pos)
      if self.guitar.controlsMatchNotes(self.controls, notes):
        self.doPick()
示例#5
0
 def run(self, ticks):
   SceneClient.run(self, ticks)
   self.time    += ticks / 50.0
   self.counter += ticks
   
   if self.counter > 5000 and self.taunt:
     self.taunt.setVolume(self.engine.config.get("audio", "guitarvol"))
     self.taunt.play()
     self.taunt = None
示例#6
0
  def keyPressed(self, key, unicode):
    ret = SceneClient.keyPressed(self, key, unicode)

    c = self.controls.keyPressed(key)
    if self.song and (c in [Player.KEY1, Player.KEY2, Player.CANCEL, Player.ACTION1, Player.ACTION2] or key == pygame.K_RETURN):
      scores = self.song.info.getHighscores(self.player.difficulty)
      if not scores or self.player.score > scores[-1][0] or len(scores) < 5:
        if self.player.cheating:
          Dialogs.showMessage(self.engine, _("No highscores for cheaters!"))
        else:
          name = Dialogs.getText(self.engine, _("%d points is a new high score! Please enter your name:") % self.player.score, self.player.name)
          if name:
            self.player.name = name
          self.highscoreIndex = self.song.info.addHighscore(self.player.difficulty, self.player.score, self.stars, self.player.name)
          self.song.info.save()

          if self.engine.config.get("game", "uploadscores"):
            self.uploadingScores = True
            fn = lambda: self.song.info.uploadHighscores(self.engine.config.get("game", "uploadurl"), self.song.getHash())
            self.engine.resource.load(self, "uploadResult", fn)

      self.showHighscores = True
      self.engine.view.pushLayer(self.menu)
      return True
    
    return ret
示例#7
0
  def run(self, ticks):
    SceneClient.run(self, ticks)
    self.time    += ticks / 50.0
    self.counter += ticks

    if self.offset != None:
      self.offset -= ticks / 20000.0
    if self.pauseScroll != None:
      self.pauseScroll += ticks / 20000.0
      

    if self.counter > 5000 and self.taunt:
      #self.taunt.setVolume(self.engine.config.get("audio", "guitarvol"))
      self.taunt.setVolume(self.engine.config.get("audio", "SFX_volume"))  #MFH - sound effect level
      self.taunt.play()
      self.taunt = None
示例#8
0
    def run(self, ticks):
        SceneClient.run(self, ticks)
        self.time += ticks / 50.0
        self.counter += ticks

        if self.offset != None:
            self.offset -= ticks / 20000.0
        if self.pauseScroll != None:
            self.pauseScroll += ticks / 20000.0

        if self.counter > 5000 and self.taunt:
            #self.taunt.setVolume(self.engine.config.get("audio", "guitarvol"))
            self.taunt.setVolume(self.engine.config.get(
                "audio", "SFX_volume"))  #MFH - sound effect level
            self.taunt.play()
            self.taunt = None
示例#9
0
  def keyPressed(self, key, unicode):
    ret = SceneClient.keyPressed(self, key, unicode)

    c = self.controls.keyPressed(key)
    if self.song and (c in [Player.KEY1, Player.KEY2, Player.CANCEL, Player.ACTION1, Player.ACTION2, Player.DRUM1A, Player.DRUM4A] or key == pygame.K_RETURN):
      for i,player in enumerate(self.playerList):
      
        scores = self.song.info.getHighscores(player.difficulty, part = player.part)
        if not scores or player.score > scores[-1][0] or len(scores) < 5:
          if player.cheating:
            Dialogs.showMessage(self.engine, _("No highscores for cheaters!"))
          elif player.score == 0: #trinidude4
            Dialogs.showMessage(self.engine, _("No highscore")) #trinidude4
          else:
            #alarian name = Dialogs.getText(self.engine, _("%d points is a new high score! Player " + str(i+1) + " enter your name") % player.score, player.name)
            name = Dialogs.getText(self.engine, _("%d points is a new high score! Enter your name") % player.score, player.name)
            if name:
              player.name = name

            #myfingershurt: don't separate chords for drum part totals:
            if player.part.text == "Drums":
              notesTotal = len([1 for time, event in self.song.track[i].getAllEvents() if isinstance(event, Song.Note)])
            else:
              notesTotal = len(set(time for time, event in self.song.track[i].getAllEvents() if isinstance(event, Song.Note)))
              
            modOptions1 = self.engine.config.getModOptions1(player.twoChord, 0)
            modOptions2 = self.engine.config.getModOptions2()
            scoreExt = (player.notesHit, notesTotal, player.longestStreak, Version.branchVersion(), modOptions1, modOptions2)
            self.highscoreIndex[i] = self.song.info.addHighscore(player.difficulty, player.score, self.stars[i], player.name, part = player.part, scoreExt = scoreExt)
            self.song.info.save()
          
            if self.engine.config.get("game", "uploadscores") and not player.cheating:
              self.uploadingScores[i] = True
              # evilynux - New url starting 20080902
              fn = lambda: self.song.info.uploadHighscores(self.engine.config.get("game", "uploadurl_w67_starpower"), self.song.getHash(), part = player.part)
              
              #self.engine.resource.load(self, "uploadResult", fn)
              self.engine.resource.load(self, "uploadResult", fn, onLoad = self.handleWorldChartRanking)  #MFH

      if len(self.playerList) > 1 and self.playerList[0].part == self.playerList[1].part and self.playerList[0].difficulty == self.playerList[1].difficulty and self.highscoreIndex[0] != -1 and self.highscoreIndex[1] != -1 and self.highscoreIndex[1] <= self.highscoreIndex[0]:
        self.highscoreIndex[0] += 1
      
      if self.song.info.count:
        count = int(self.song.info.count)
      else:
        count = 0
      count += 1
      self.song.info.count = "%d" % count
      self.song.info.save()
      self.showHighscores = True
      self.engine.view.pushLayer(self.menu)
      return True
    return ret
示例#10
0
  def keyPressed(self, key, unicode):
    ret = SceneClient.keyPressed(self, key, unicode)

    c = self.controls.keyPressed(key)
    if self.song and (c in [Player.KEY1, Player.KEY2, Player.CANCEL, Player.ACTION1, Player.ACTION2, Player.DRUM1A, Player.DRUM4A] or key == pygame.K_RETURN):
      for i,player in enumerate(self.playerList):
      
        scores = self.song.info.getHighscores(player.difficulty, part = player.part)
        if not scores or player.score > scores[-1][0] or len(scores) < 5:
          if player.cheating:
            Dialogs.showMessage(self.engine, _("No highscores for cheaters!"))
          elif player.score == 0: #trinidude4
            Dialogs.showMessage(self.engine, _("No highscore")) #trinidude4
          else:
            #alarian name = Dialogs.getText(self.engine, _("%d points is a new high score! Player " + str(i+1) + " enter your name") % player.score, player.name)
            name = Dialogs.getText(self.engine, _("%d points is a new high score! Enter your name") % player.score, player.name)
            if name:
              player.name = name

            #myfingershurt: don't separate chords for drum part totals:
            if player.part.text == "Drums":
              notesTotal = len([1 for time, event in self.song.track[i].getAllEvents() if isinstance(event, Song.Note)])
            else:
              notesTotal = len(set(time for time, event in self.song.track[i].getAllEvents() if isinstance(event, Song.Note)))
              
            modOptions1 = self.engine.config.getModOptions1(player.twoChord, 0)
            modOptions2 = self.engine.config.getModOptions2()
            scoreExt = (player.notesHit, notesTotal, player.longestStreak, Version.branchVersion(), modOptions1, modOptions2)
            self.highscoreIndex[i] = self.song.info.addHighscore(player.difficulty, player.score, self.stars[i], player.name, part = player.part, scoreExt = scoreExt)
            self.song.info.save()
          
            if self.engine.config.get("game", "uploadscores") and not player.cheating:
              self.uploadingScores = True
              #myfingershurt: ensuring new SP highscore upload URL is used from Divra (set to default in gameengine.py)
              # evilynux - New url starting 20080902
              fn = lambda: self.song.info.uploadHighscores(self.engine.config.get("game", "uploadurl_w67_starpower"), self.song.getHash(), part = player.part)
              
              self.engine.resource.load(self, "uploadResult", fn)

      if len(self.playerList) > 1 and self.playerList[0].part == self.playerList[1].part and self.playerList[0].difficulty == self.playerList[1].difficulty and self.highscoreIndex[0] != -1 and self.highscoreIndex[1] != -1 and self.highscoreIndex[1] <= self.highscoreIndex[0]:
        self.highscoreIndex[0] += 1
      
      if self.song.info.count:
        count = int(self.song.info.count)
      else:
        count = 0
      count += 1
      self.song.info.count = "%d" % count
      self.song.info.save()
      self.showHighscores = True
      self.engine.view.pushLayer(self.menu)
      return True
    return ret
示例#11
0
  def run(self, ticks):
    SceneClient.run(self, ticks)
    self.time    += ticks / 50.0
    self.counter += ticks

    if self.offset != None:
      self.offset -= ticks / 20000.0
    if self.pauseScroll != None:
      self.pauseScroll += ticks / 20000.0
      
    if self.counter > 5000 and self.taunt:
      #self.taunt.setVolume(self.engine.config.get("audio", "guitarvol"))
      self.taunt.setVolume(self.engine.config.get("audio", "SFX_volume"))  #MFH - sound effect level
      self.taunt.play()
      self.taunt = None

    #MFH - add counter here to play another crowd cheer before the one playing ends for an endless cheering loop
    if self.engine.data.cheerSoundFound > 0 and self.resultCheerLoop > 0:
      if self.resultCheerLoop == 2 or (self.resultCheerLoop == 1 and self.engine.data.cheerSoundFound == 2):
        self.cheerLoopCounter += 1
        if self.cheerLoopCounter >= self.cheerLoopDelay:
          self.cheerLoopCounter = 0
          self.engine.data.crowdSound.play()
  def keyPressed(self, key, unicode):
    ret = SceneClient.keyPressed(self, key, unicode)

    c = self.controls.keyPressed(key)
    if self.song and (c in [Player.KEY1, Player.KEY2, Player.CANCEL, Player.ACTION1, Player.ACTION2] or key == pygame.K_RETURN):
      for i,player in enumerate(self.playerList):
        scores = self.song.info.getHighscores(player.difficulty, part = player.part)
        if not scores or player.score > scores[-1][0] or len(scores) < 5:
          if player.cheating:
            Dialogs.showMessage(self.engine, _("No highscores for cheaters!"))
          else:
            name = Dialogs.getText(self.engine, _("%d points is a new high score! Player " + str(i+1) + " enter your name") % player.score, player.name)
            if name:
              player.name = name
            notesTotal = len([1 for time, event in self.song.track[i].getAllEvents() if isinstance(event, Song.Note)])
            modOptions1 = self.engine.config.getModOptions1(player.twoChord, 0)
            modOptions2 = self.engine.config.getModOptions2()
            scoreExt = (player.notesHit, notesTotal, player.longestStreak, Version.branchVersion(), modOptions1, modOptions2)
            self.highscoreIndex[i] = self.song.info.addHighscore(player.difficulty, player.score, self.stars[i], player.name, part = player.part, scoreExt = scoreExt)
            self.song.info.save()
          
            if self.engine.config.get("game", "uploadscores"):
              self.uploadingScores = True
              fn = lambda: self.song.info.uploadHighscores(self.engine.config.get("game", "uploadurl"), self.song.getHash(), part = player.part)
              self.engine.resource.load(self, "uploadResult", fn)

      if len(self.playerList) > 1 and self.playerList[0].part == self.playerList[1].part and self.playerList[0].difficulty == self.playerList[1].difficulty and self.highscoreIndex[0] != None and self.highscoreIndex[1] != None and self.highscoreIndex[1] <= self.highscoreIndex[0]:
        self.highscoreIndex[0] += 1
      
      if self.song.info.count:
        count = int(self.song.info.count)
      else:
        count = 0
      count += 1
      self.song.info.count = "%d" % count
      self.song.info.save()
      self.showHighscores = True
      self.engine.view.pushLayer(self.menu)
      return True
    return ret
示例#13
0
  def run(self, ticks):
    SceneClient.run(self, ticks)
    players = 1

    if not self.wizardStarted:
      self.wizardStarted = True

      if not self.songName:
        while 1:
          if self.engine.cmdPlay == 2:
            self.songName = Config.get("game", "selected_song")
            self.libraryName = Config.get("game", "selected_library")
          else:
            self.mode = 1
            self.libraryName, self.songName = \
              Dialogs.chooseSong(self.engine, \
                               selectedLibrary = Config.get("game", "selected_library"),
                               selectedSong    = Config.get("game", "selected_song"))

            if self.libraryName == None:
              newPath = Dialogs.chooseFile(self.engine, masks = ["*/songs"], prompt = _("Choose a new songs directory."), dirSelect = True)
              if newPath != None:
                Config.set("game", "base_library", os.path.dirname(newPath))
                Config.set("game", "selected_library", "songs")
                Config.set("game", "selected_song", "")
                self.engine.resource.refreshBaseLib()   #myfingershurt - to let user continue with new songpath without restart

            if not self.songName:
              self.session.world.finishGame()
              return

          if not self.tut:
            Config.set("game", "selected_library", self.libraryName)
            Config.set("game", "selected_song",    self.songName)
          self.mode = 2
          info = Song.loadSongInfo(self.engine, self.songName, library = self.libraryName)

          selected = False
          escape = False
          escaped = False

          #while True:    #this nesting is now useless
          #MFH - add "Practice" mode, which will activate a section selection menu before "part"
          #racer: main menu instead of second menu practice

          #self.player.practiceMode = Player.PracticeSet

            #MFH - parameters for newLocalGame:
            #players = -1 (party mode), 1, 2
            #mode1p = 0 (quickplay), 1 (practice), 2 (career)
            #mode2p = 0 (face-off), 1 (pro face-off)
              #Config.define("game",   "players",             int,   1)
              #Config.define("game","game_mode",           int,  0)
              #Config.define("game","multiplayer_mode",           int,  0)

          if Config.get("game","game_mode") == 1 and Config.get("game","players") == 1:    #practice mode
            self.player.practiceMode = True
          else:
            self.player.practiceMode = False

          slowDownDivisor = Config.get("audio",  "speed_factor")

          while 1: #new nesting for Practice Mode - section / start time selection
            if self.player.practiceMode:
              values, options = Config.getOptions("audio", "speed_factor")
              if self.subMenuPosTuple:
                slowdown = Dialogs.chooseItem(self.engine, options, "%s \n %s" % (Dialogs.removeSongOrderPrefixFromName(info.name), _("Speed Select:")), pos = self.subMenuPosTuple)
              else:
                slowdown = Dialogs.chooseItem(self.engine, options, "%s \n %s" % (Dialogs.removeSongOrderPrefixFromName(info.name), _("Speed Select:")))
              for i in range(len(values)):
                if options[i] == slowdown:
                  self.player.practiceSpeed = values[i]
                  slowDownDivisor = values[i]
                  break

            if self.player.practiceMode:

              sectionLabels = [sLabel for sLabel,sPos in info.sections]

              if self.subMenuPosTuple:
                startLabel = Dialogs.chooseItem(self.engine, sectionLabels, "%s \n %s" % (Dialogs.removeSongOrderPrefixFromName(info.name), _("Start Section:")), pos = self.subMenuPosTuple)
              else:
                startLabel = Dialogs.chooseItem(self.engine, sectionLabels, "%s \n %s" % (Dialogs.removeSongOrderPrefixFromName(info.name), _("Start Section:")))

              if startLabel:
                Log.debug("Practice start section selected: " + startLabel)
            else:
              startLabel = "Gig"
            if startLabel:
              self.player.practiceSection = startLabel

              #find start position in array:
              try:
                tempStart = [sPos for sLabel,sPos in info.sections if sLabel == startLabel]
                if tempStart == []:
                  self.player.startPos = 0.0
                else:
                  self.player.startPos = tempStart[0]
                Log.debug("Practice start position retrieved: " + str(self.player.startPos))
              except:
                Log.error("Cannot retrieve start position!")
                self.player.startPos = 0.0
                break
            else:
              #self.player.startPos = 0.0

              break;

            guitars = []
            drums = []
            vocals = []
            autoPart = None
            for part in info.parts:
              if part.id == 4:
                drums.append(part)
              elif part.id == 5:
                vocals.append(part)
              else:
                guitars.append(part)
              if self.engine.cmdPlay == 2 and self.engine.cmdPart is not None and len(self.playerList) == 1:
                if self.engine.cmdPart == part.id:
                  Log.debug("Command-line mode: Part found!")
                  if part.id == 4 and self.engine.input.gameDrums > 0:
                    autoPart = part.id
                  elif part.id == 5 and self.engine.input.gameMics > 0:
                    autoPart = part.id
                  elif self.engine.input.gameGuitars > 0:
                    autoPart = part.id
            if autoPart is None:
              if len(drums) == 0 and self.engine.input.gameDrums > 0:
                Dialogs.showMessage(self.engine, _("There are no drum parts in this song. Change your controllers to play."))
                escaped = True
                if self.engine.cmdPlay == 2:
                  self.engine.cmdPlay = 0
                break
              if len(guitars) == 0 and self.engine.input.gameGuitars > 0:
                Dialogs.showMessage(self.engine, _("There are no guitar parts in this song. Change your controllers to play."))
                escaped = True
                if self.engine.cmdPlay == 2:
                  self.engine.cmdPlay = 0
                break
              if len(vocals) == 0 and self.engine.input.gameMics > 0:
                Dialogs.showMessage(self.engine, _("There are no vocal parts in this song. Change your controllers to play."))
                escaped = True
                if self.engine.cmdPlay == 2:
                  self.engine.cmdPlay = 0
                break

              for i, player in enumerate(self.playerList):

                while 1: #new nesting for Practice Mode selection
                  selectedPlayer = False
                  choose = []
                  if player.controlType == 2 or player.controlType == 3:
                    choose = drums
                  elif player.controlType == 5:
                    choose = vocals
                  else:
                    choose = guitars

                  if len(choose) > 1:

                    if self.subMenuPosTuple:
                      p = Dialogs.chooseItem(self.engine, choose, "%s \n %s" % (Dialogs.removeSongOrderPrefixFromName(info.name), _("%s Choose a part:") % player.name), selected = player.part, pos = self.subMenuPosTuple)
                    else:
                      p = Dialogs.chooseItem(self.engine, choose, "%s \n %s" % (Dialogs.removeSongOrderPrefixFromName(info.name), _("%s Choose a part:") % player.name), selected = player.part)

                  else:
                    p = choose[0]
                  if p:
                    player.part = p
                  else:
                    if not player.practiceMode:
                      escaped = True
                    break;
                  while 1:
                    if len(info.partDifficulties[p.id]) > 1:

                      if self.subMenuPosTuple:
                        d = Dialogs.chooseItem(self.engine, info.partDifficulties[p.id],
                                           "%s \n %s" % (Dialogs.removeSongOrderPrefixFromName(info.name), _("%s Choose a difficulty:") % player.name), selected = player.difficulty, pos = self.subMenuPosTuple)
                      else:
                        d = Dialogs.chooseItem(self.engine, info.partDifficulties[p.id],
                                           "%s \n %s" % (Dialogs.removeSongOrderPrefixFromName(info.name), _("%s Choose a difficulty:") % player.name), selected = player.difficulty)

                    else:
                      try:
                        d = info.partDifficulties[p.id][0]
                      except:
                        # Bug : nothing inside...
                        d = None
                        pass
                    if d:
                      player.difficulty = d
                      selectedPlayer = True
                    else:
                      if len(choose) <= 1:
                        #escape = True
                        escaped = True
                      break
                    if selectedPlayer:
                      break
                  if selectedPlayer or escaped:
                    break

                #if selected or escaped: #new nesting for Practice Mode selection
                if selected or escaped: #new nesting for Practice Mode selection
                  break

              else:
                selected = True

              if selected or escaped: #new nesting for Practice Mode section selection
                break

            else:
              self.playerList[0].part = Song.parts[autoPart]
              for diff in info.partDifficulties[autoPart]:
                if self.engine.cmdDiff == diff.id:
                  self.playerList[0].difficulty = diff
                  break
              else:
                self.playerList[0].difficulty = info.partDifficulties[autoPart][0]
              selected = True
              break

          if (not selected) or escape:
            continue
          break
      else:
        #evilynux - Fixes Practice Mode from the cmdline
        if Config.get("game","game_mode") == 1 and Config.get("game","players") == 1:
          self.player.practiceMode = True
        info = Song.loadSongInfo(self.engine, self.songName, library = self.libraryName)

      if self.engine.cmdPlay == 3:
        if len(info.parts) >= self.engine.cmdPart:
          self.player.part = info.parts[self.engine.cmdPart]
        if len(info.partDifficulties[self.player.part.id]) >= self.engine.cmdDiff:
          self.player.difficulty = info.partDifficulties[self.player.part.id][self.engine.cmdDiff]


      # Make sure the difficulty we chose is available
      if not self.player.part in info.parts:
        self.player.part = info.parts[0]
      if not self.player.difficulty in info.partDifficulties[self.player.part.id]:
        self.player.difficulty = info.partDifficulties[self.player.part.id][0]

      if not self.engine.createdGuitarScene:
        if self.engine.cmdPlay > 0:
          self.engine.cmdPlay = 3
        #self.engine.createdGuitarScene = True
        self.session.world.deleteScene(self)
        self.session.world.createScene("GuitarScene", libraryName = self.libraryName, songName = self.songName, Players = players)
示例#14
0
    def render(self, visibility, topMost):
        self.engine.view.setViewport(1, 0)
        SceneClient.render(self, visibility, topMost)

        bigFont = self.engine.data.bigFont
        font = self.engine.data.font

        v = ((1 - visibility)**2)

        glEnable(GL_BLEND)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
        glEnable(GL_COLOR_MATERIAL)

        self.engine.view.setOrthogonalProjection(normalize=True)
        try:
            t = self.time / 100
            w, h, = self.engine.view.geometry[2:4]
            r = .5
            if self.background:
                imgwidth = self.background.width1()
                wfactor = 640.000 / imgwidth
                self.background.transform.reset()
                #self.background.transform.scale(1,-1)
                self.background.transform.scale(wfactor, -wfactor)
                self.background.transform.translate(w / 2, h / 2)
                self.background.draw()

            if self.showHighscores:
                for j, player in enumerate(self.playerList):
                    #self.engine.view.setViewportHalf(len(self.playerList),j)
                    scale = 0.0017
                    endScroll = -.14

                    if self.pauseScroll != None:
                        self.offset = 0.0

                    if self.pauseScroll > 0.5:
                        self.pauseScroll = None
                    if self.offset == None:
                        self.offset = 0
                        self.pauseScroll = 0
                        self.nextHighScore()

                    # evilynux - highscore
                    if self.song is not None:
                        text = _("%s High Scores for %s") % (
                            self.scorePart, self.song.info.name)
                    else:
                        text = _("%s High Scores") % self.scorePart
                    w, h = font.getStringSize(text)

                    Theme.setBaseColor(1 - v)
                    font.render(text, (.5 - w / 2, .01 - v + self.offset))

                    text = _("Difficulty: %s") % (self.scoreDifficulty)
                    w, h = font.getStringSize(text)
                    Theme.setBaseColor(1 - v)
                    font.render(text, (.5 - w / 2, .01 - v + h + self.offset))

                    x = .01
                    y = .16 + v

                if self.song:
                    i = -1
                    for i, scores in enumerate(
                            self.song.info.getHighscores(self.scoreDifficulty,
                                                         part=self.scorePart)):
                        score, stars, name, scores_ext = scores
                        notesHit, notesTotal, noteStreak, modVersion, modOptions1, modOptions2 = scores_ext
                        if stars == 6:
                            stars = 5
                            perfect = 1
                        else:
                            perfect = 0
                        for j, player in enumerate(self.playerList):
                            if (self.time % 10.0
                                ) < 5.0 and i == self.highscoreIndex[
                                    j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part:
                                Theme.setSelectedColor(1 - v)
                                break
                            else:
                                Theme.setBaseColor(1 - v)
                        font.render("%d." % (i + 1), (x, y + self.offset),
                                    scale=scale)
                        if notesTotal != 0:
                            score = "%s %.1f%%" % (
                                score, (float(notesHit) / notesTotal) * 100.0)
                        if noteStreak != 0:
                            score = "%s (%d)" % (score, noteStreak)
                        font.render(unicode(score), (x + .05, y + self.offset),
                                    scale=scale)
                        options = ""
                        w2, h2 = font.getStringSize(options, scale=scale / 2)
                        font.render(unicode(options),
                                    (.6 - w2, y + self.offset),
                                    scale=scale / 2)
                        # evilynux - Fixed star size following Font render bugfix
                        if perfect == 1 and self.theme == 2:
                            glColor3f(
                                1, 1,
                                0)  #racer: perfect is now gold for rock band
                        font.render(unicode(Data.STAR2 * stars + Data.STAR1 *
                                            (5 - stars)),
                                    (x + .6, y + self.offset),
                                    scale=scale * 1.8)
                        if perfect == 1 and self.theme < 2:
                            glColor3f(
                                0, 1, 0
                            )  #racer: perfect is green for any non-RB theme
                        font.render(unicode(Data.STAR2 * stars + Data.STAR1 *
                                            (5 - stars)),
                                    (x + .6, y + self.offset),
                                    scale=scale * 1.8)
                        for j, player in enumerate(self.playerList):
                            if (self.time % 10.0
                                ) < 5.0 and i == self.highscoreIndex[
                                    j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part:
                                Theme.setSelectedColor(1 - v)
                                break
                            else:
                                Theme.setBaseColor(1 - v)
                        font.render(name, (x + .8, y + self.offset),
                                    scale=scale)
                        y += h
                        endScroll -= .07

                    if self.offset < endScroll or i == -1:
                        self.offset = .8
                        self.nextHighScore()
                        endScroll = -0.14

                if self.uploadingScores and self.uploadResult is None:
                    Theme.setBaseColor(1 - v)
                    font.render(_("Uploading Scores..."), (.05, .7 + v),
                                scale=0.001)
                return

            Theme.setBaseColor(1 - v)
            if self.playerList[0].cheating:
                text = _("%s Cheated!") % self.song.info.name
            else:
                text = _("%s Finished!") % self.song.info.name
                w, h = font.getStringSize(text)
                Dialogs.wrapText(font, (.05, .045 - v), text)
                text = "%d/" % self.hits
                text2 = _("%d notes hit") % self.totalnotes
                text = text + text2
                w, h = font.getStringSize(text)
                Dialogs.wrapText(font, (.5 - w / 2, .54 - v - h), text)

            for j, player in enumerate(self.playerList):
                if self.playerList[j].cheating:
                    self.stars[j] = 0
                    self.accuracy[j] = 0.0

                self.engine.view.setViewportHalf(len(self.playerList), j)
                text = "%d" % (player.score * self.anim(1000, 2000))
                w, h = bigFont.getStringSize(text)
                bigFont.render(text, (.5 - w / 2, .11 + v +
                                      (1.0 - self.anim(0, 1000)**3)),
                               scale=0.0025)

                if self.counter > 1000:
                    scale = 0.0017
                    if self.stars[
                            j] == 6 and self.theme == 2:  #racer: gold perfect for RB
                        glColor3f(1, 1, 0)
                        text = (Data.STAR2 * (self.stars[j] - 1))
                    elif self.stars[
                            j] == 6 and self.theme < 2:  #racer: green perfect for non-RB
                        glColor3f(0, 1, 0)
                        text = (Data.STAR2 * (self.stars[j] - 1))
                    else:
                        text = (Data.STAR2 * self.stars[j] + Data.STAR1 *
                                (5 - self.stars[j]))

                    w, h = bigFont.getStringSize(Data.STAR1, scale=scale)
                    x = .5 - w * len(text) / 2
                    for i, ch in enumerate(text):
                        bigFont.render(
                            ch, (x + 100 *
                                 (1.0 - self.anim(1000 + i * 200, 1000 +
                                                  (i + 1) * 200))**2, .35 + v),
                            scale=scale)
                        x += w

                if self.counter > 2500:
                    Theme.setBaseColor(1 - v)
                    text = _("Accuracy: %.1f%%") % self.accuracy[j]
                    w, h = font.getStringSize(text)
                    font.render(text, (.5 - w / 2, .55 + v))
                    text = _("Longest note streak: %d") % player.longestStreak
                    w, h = font.getStringSize(text)
                    font.render(text, (.5 - w / 2, .55 + h + v))
                    if player.twoChord > 0:
                        text = _("Part: %s on %s (2 chord)") % (
                            player.part, player.difficulty)
                    else:
                        text = _("Part: %s on %s") % (player.part,
                                                      player.difficulty)
                    w, h = font.getStringSize(text)
                    font.render(text, (.5 - w / 2, .55 + (2 * h) + v))
            self.engine.view.setViewport(1, 0)
        finally:
            self.engine.view.setViewport(1, 0)
            self.engine.view.resetProjection()
示例#15
0
 def hidden(self):
     SceneClient.hidden(self)
     if self.nextScene:
         self.nextScene()
  def render(self, visibility, topMost):
    SceneClient.render(self, visibility, topMost)
    
    bigFont = self.engine.data.bigFont
    font    = self.engine.data.font

    v = ((1 - visibility) ** 2)
    
    glEnable(GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glEnable(GL_COLOR_MATERIAL)

    self.engine.view.setOrthogonalProjection(normalize = True)
    try:
      t = self.time / 100
      w, h, = self.engine.view.geometry[2:4]
      r = .5
      if self.background:
        if self.spinnyDisabled != True and Theme.spinnyResultsDisabled != True:
          self.background.transform.reset()
          self.background.transform.translate(v * 2 * w + w / 2 + math.cos(t / 2) * w / 2 * r, h / 2 + math.sin(t) * h / 2 * r)
          self.background.transform.rotate(-t)
          self.background.transform.scale(math.sin(t / 8) + 2, math.sin(t / 8) + 2)
        self.background.draw()
      
      if self.showHighscores:
        for j,player in enumerate(self.playerList):
          #self.engine.view.setViewportHalf(len(self.playerList),j)
          scale = 0.0017
          endScroll = -.14
        
          if self.pauseScroll != None:
            self.offset = 0.0

          if self.pauseScroll > 0.5:
            self.pauseScroll = None
          if self.offset == None:
            self.offset = 0
            self.pauseScroll = 0
            self.nextHighScore()

          
          text = _("%s High Scores") % (self.scorePart)
          w, h = font.getStringSize(text)

          Theme.setBaseColor(1 - v)
          font.render(text, (.5 - w / 2, .01 - v + self.offset))

          text = _("Difficulty: %s") % (self.scoreDifficulty)
          w, h = font.getStringSize(text)
          Theme.setBaseColor(1 - v)
          font.render(text, (.5 - w / 2, .01 - v + h + self.offset))
        
          x = .01
          y = .16 + v
          
        if self.song:
          i = -1
          for i, scores in enumerate(self.song.info.getHighscores(self.scoreDifficulty, part = self.scorePart)):
            score, stars, name, scores_ext = scores
            notesHit, notesTotal, noteStreak, modVersion, modOptions1, modOptions2 = scores_ext
            if stars == 6:
              stars = 5
              perfect = 1
            else:
              perfect = 0
            for j,player in enumerate(self.playerList):
              if (self.time % 10.0) < 5.0 and i == self.highscoreIndex[j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part:
                Theme.setSelectedColor(1 - v)
                break
              else:
                Theme.setBaseColor(1 - v)
            font.render("%d." % (i + 1), (x, y + self.offset),    scale = scale)
            if notesTotal != 0:
              score = "%s %.1f%%" % (score, (float(notesHit) / notesTotal) * 100.0)
            if noteStreak != 0:
              score = "%s %d" % (score, noteStreak)
            font.render(unicode(score), (x + .05, y + self.offset),   scale = scale)
            options = ""
            #options = "%s,%s" % (modOptions1, modOptions2)
            #options = self.engine.config.prettyModOptions(options)
            w2, h2 = font.getStringSize(options, scale = scale / 2)
            font.render(unicode(options), (.6 - w2, y + self.offset),   scale = scale / 2)
            if perfect == 1:
              glColor3f(0, 1, 0)
            font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale = scale * .9)
            for j,player in enumerate(self.playerList):
              if (self.time % 10.0) < 5.0 and i == self.highscoreIndex[j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part:
                Theme.setSelectedColor(1 - v)
                break
              else:
                Theme.setBaseColor(1 - v)
            font.render(name, (x + .8, y + self.offset), scale = scale)
            y += h
            endScroll -= .07
            
          if self.offset < endScroll or i == -1:
            self.offset = .8
            self.nextHighScore()
            endScroll = -0.14
          
        if self.uploadingScores and self.uploadResult is None:
          Theme.setBaseColor(1 - v)
          font.render(_("Uploading Scores..."), (.05, .7 + v), scale = 0.001)
        #self.engine.view.setViewport(1,0)
        return



   
      Theme.setBaseColor(1 - v)
      if self.playerList[0].cheating:
        text = _("%s Cheated!" % self.song.info.name)
  
      else:
        text = _("%s Finished!" % self.song.info.name)
      w, h = font.getStringSize(text)
      Dialogs.wrapText(font, (.05, .05 - v), text)
        
      for j,player in enumerate(self.playerList):
        if self.playerList[j].cheating:
          self.stars[j] = 0
          self.accuracy[j] = 0.0
    
        self.engine.view.setViewportHalf(len(self.playerList),j)
        text = "%d" % (player.score * self.anim(1000, 2000))
        w, h = bigFont.getStringSize(text)
        bigFont.render(text, (.5 - w / 2, .11 + v + (1.0 - self.anim(0, 1000) ** 3)), scale = 0.0025)
      
        if self.counter > 1000:
          scale = 0.0017
          if self.stars[j] == 6:
            glColor3f(0, 1, 0)  
            text = (Data.STAR2 * (self.stars[j] - 1))
          else:
            text = (Data.STAR2 * self.stars[j] + Data.STAR1 * (5 - self.stars[j]))

          w, h = bigFont.getStringSize(Data.STAR1, scale = scale)
          x = .5 - w * len(text) / 2
          for i, ch in enumerate(text):
            bigFont.render(ch, (x + 100 * (1.0 - self.anim(1000 + i * 200, 1000 + (i + 1) * 200)) ** 2, .35 + v), scale = scale)
            x += w
      
        if self.counter > 2500:
          Theme.setBaseColor(1 - v)
          text = _("Accuracy: %.1f%%") % self.accuracy[j]
          w, h = font.getStringSize(text)
          font.render(text, (.5 - w / 2, .54 + v))
          text = _("Longest note streak: %d") % player.longestStreak
          w, h = font.getStringSize(text)
          font.render(text, (.5 - w / 2, .54 + h + v))
        # self.player.twoChord
          if player.twoChord > 0:
            text = _("Part: %s on %s (2 chord)") % (player.part, player.difficulty)
          else:
            text = _("Part: %s on %s") % (player.part, player.difficulty)
          w, h = font.getStringSize(text)
          font.render(text, (.5 - w / 2, .54 + (2 * h)+ v))
      self.engine.view.setViewport(1,0)
    finally:
      self.engine.view.setViewport(1,0)
      self.engine.view.resetProjection()
示例#17
0
  def render(self, visibility, topMost):
    SceneClient.render(self, visibility, topMost)
    
    bigFont = self.engine.data.bigFont
    font    = self.engine.data.font

    v = ((1 - visibility) ** 2)
    
    glEnable(GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glEnable(GL_COLOR_MATERIAL)

    self.engine.view.setOrthogonalProjection(normalize = True)
    try:
      t = self.time / 100
      w, h, = self.engine.view.geometry[2:4]
      r = .5
      self.background.transform.reset()
      self.background.transform.translate(v * 2 * w + w / 2 + math.cos(t / 2) * w / 2 * r, h / 2 + math.sin(t) * h / 2 * r)
      self.background.transform.rotate(-t)
      self.background.transform.scale(math.sin(t / 8) + 2, math.sin(t / 8) + 2)
      self.background.draw()
      
      if self.showHighscores:
        scale = 0.0017
        d = self.player.difficulty
        
        text = _("Highest Scores (%s)") % d
        w, h = font.getStringSize(text)
        Theme.setBaseColor(1 - v)
        font.render(text, (.5 - w / 2, .05 - v))
        
        x = .1
        y = .15 + v
        for i, scores in enumerate(self.song.info.getHighscores(d)):
          score, stars, name = scores
          if i == self.highscoreIndex and (self.time % 10.0) < 5.0:
            Theme.setSelectedColor(1 - v)
          else:
            Theme.setBaseColor(1 - v)
          font.render("%d." % (i + 1), (x, y),    scale = scale)
          font.render(unicode(score), (x + .05, y),   scale = scale)
          font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .25, y), scale = scale * .9)
          font.render(name, (x + .5, y), scale = scale)
          y += h
          
        if self.uploadingScores:
          Theme.setBaseColor(1 - v)
          if self.uploadResult is None:
            text = _("Uploading Scores...")
          else:
            success, ordinal = self.uploadResult
            if success:
              if ordinal > 0:
                text = _("You're #%d on the world charts!") % ordinal
              else:
                text = ""
            else:
              text = _("Score upload failed")
          font.render(text, (.05, .7 + v), scale = 0.001)
        return
      
      Theme.setBaseColor(1 - v)
      text = _("Song Finished!")
      w, h = font.getStringSize(text)
      font.render(text, (.5 - w / 2, .05 - v))
      
      text = "%d" % (self.player.score * self.anim(1000, 2000))
      w, h = bigFont.getStringSize(text)
      bigFont.render(text, (.5 - w / 2, .11 + v + (1.0 - self.anim(0, 1000) ** 3)), scale = 0.0025)
      
      if self.counter > 1000:
        scale = 0.0017
        text = (Data.STAR2 * self.stars + Data.STAR1 * (5 - self.stars))
        w, h = bigFont.getStringSize(Data.STAR1, scale = scale)
        x = .5 - w * len(text) / 2
        for i, ch in enumerate(text):
          bigFont.render(ch, (x + 100 * (1.0 - self.anim(1000 + i * 200, 1000 + (i + 1) * 200)) ** 2, .35 + v), scale = scale)
          x += w
      
      if self.counter > 2500:
        text = _("Accuracy: %d%%") % self.accuracy      
        w, h = font.getStringSize(text)
        font.render(text, (.5 - w / 2, .55 + v))
        text = _("Longest note streak: %d") % self.player.longestStreak
        w, h = font.getStringSize(text)
        font.render(text, (.5 - w / 2, .55 + h + v))
    finally:
      self.engine.view.resetProjection()
示例#18
0
  def run(self, ticks):
    SceneClient.run(self, ticks)
    players = 1

    if not self.wizardStarted:
      self.wizardStarted = True

      if self.engine.cmdPlay == 1:
        self.songName = Config.get("game", "selected_song")
        self.libraryName = Config.get("game", "selected_library")
        self.engine.cmdPlay = 2

      if not self.songName:
        while True:
          self.libraryName, self.songName = \
            Dialogs.chooseSong(self.engine, \
                               selectedLibrary = Config.get("game", "selected_library"),
                               selectedSong    = Config.get("game", "selected_song"))

          if self.libraryName == None:
            newPath = Dialogs.chooseFile(self.engine, masks = ["*/songs"], prompt = _("Choose a new songs directory."), dirSelect = True)
            if newPath != None:
              Config.set("game", "base_library", os.path.dirname(newPath))
              Config.set("game", "selected_library", "songs")
              Config.set("game", "selected_song", "")
              self.engine.resource.refreshBaseLib()   #myfingershurt - to let user continue with new songpath without restart
            
          if not self.songName:
            self.session.world.finishGame()
            return

          Config.set("game", "selected_library", self.libraryName)
          Config.set("game", "selected_song",    self.songName)
          
          info = Song.loadSongInfo(self.engine, self.songName, library = self.libraryName)

          selected = False
          escape = False
          escaped = False
            
          #while True:    #this nesting is now useless
          #MFH - add "Practice" mode, which will activate a section selection menu before "part"
          #racer: main menu instead of second menu practice
          
          #self.player.practiceMode = Player.PracticeSet

            #MFH - parameters for newLocalGame:
            #players = -1 (party mode), 1, 2
            #mode1p = 0 (quickplay), 1 (practice), 2 (career)
            #mode2p = 0 (face-off), 1 (pro face-off)
              #Config.define("game",   "players",             int,   1)
              #Config.define("player0","mode_1p",           int,  0)
              #Config.define("player1","mode_2p",           int,  0)

          if Config.get("player0","mode_1p") == 1 and Config.get("game","players") == 1:    #practice mode
            self.player.practiceMode = True
          else:
            self.player.practiceMode = False
           
          while True: #new nesting for Practice Mode - section / start time selection
            if self.player.practiceMode:
              #self.engine.resource.load(self, "song", lambda: Song.loadSong(self.engine, songName, library = self.libraryName, notesOnly = True, part = [player.part for player in self.playerList]), onLoad = self.songLoaded)

              
              #startTime = Dialogs.chooseItem(self.engine, info.sections, "%s \n %s" % (info.name, _("Start Section:")))
              
              sectionLabels = [sLabel for sLabel,sPos in info.sections]
              startLabel = Dialogs.chooseItem(self.engine, sectionLabels, "%s \n %s" % (info.name, _("Start Section:")))
              if startLabel:
                Log.debug("Practice start section selected: " + startLabel)
            else:
              startLabel = "Gig"
            if startLabel:
              self.player.practiceSection = startLabel
              
              #find start position in array:
              self.player.startPos = [sPos for sLabel,sPos in info.sections if sLabel == startLabel]
              Log.debug("Practice start position retrieved: " + str(self.player.startPos) )
              
            else:
              
              break;
            #if not self.player.practiceMode:
              #selected = True  #this causes "gig" mode to start song with all defaults
              #escape = True  #this causes "gig" mode to exit out to the song selection
              #escaped = True  #this does nothing :(
              #break;

          
          
          
            while True: #new nesting for Practice Mode selection
            
              if len(info.parts) > 1:
                p = Dialogs.chooseItem(self.engine, info.parts, "%s \n %s" % (info.name, _("Player 1 Choose a part:")), selected = self.player.part)
              else:
                p = info.parts[0]
              if p:
                self.player.part = p
              else:
                if not self.player.practiceMode:
                  escaped = True
                break;
              while True:
                if len(info.difficulties) > 1:
                  d = Dialogs.chooseItem(self.engine, info.difficulties,
                                       "%s \n %s" % (info.name, _("Player 1 Choose a difficulty:")), selected = self.player.difficulty)
                else:
                  d = info.difficulties[0]
                if d:
                  self.player.difficulty = d
                else:
                  if len(info.parts) <= 1:
                    #escape = True
                    escaped = True
                  break
                while True:
                  if self.engine.config.get("game", "players") > 1:               
                    #p = Dialogs.chooseItem(self.engine, info.parts + ["Party Mode"] + ["No Player 2"], "%s \n %s" % (info.name, _("Player 2 Choose a part:")), selected = self.player2.part)
                    p = Dialogs.chooseItem(self.engine, info.parts, "%s \n %s" % (info.name, _("Player 2 Choose a part:")), selected = self.player2.part)
                    #if p and p == "No Player 2":
                    #  players = 1
                    #  selected = True
                    #  self.player2.part = p
                    #  break
                    #elif p and p == "Party Mode":
                    #  players = -1
                    #  selected = True
                    #  self.player2.part = p
                    #  break
                    #elif p and p != "No Player 2" and p != "Party Mode":
                    if p:
                      players = 2
                      self.player2.part = p
  
                    else:
                      if len(info.difficulties) <= 1:
                        escaped = True
                      if len(info.parts) <= 1:
                        escape = True
                      break
                    while True:                    
                      if len(info.difficulties) > 1:
                        d = Dialogs.chooseItem(self.engine, info.difficulties, "%s \n %s" % (info.name, _("Player 2 Choose a difficulty:")), selected = self.player2.difficulty)
                      else:
                        d = info.difficulties[0]
                      if d:
                        self.player2.difficulty = d
                      else:
                        break
                      selected = True
                      break
                  else:
                    selected = True
                    break
                  if selected:
                    break
                if selected or escaped:
                  break
            
              #if selected or escaped: #new nesting for Practice Mode selection
              if selected or escaped: #new nesting for Practice Mode selection
                break

            if selected or escaped: #new nesting for Practice Mode section selection
              break

          
          #useless practice mode nesting
          #if selected or escape:
          #  break

          if (not selected) or escape:
            continue
          break
      else:
        #evilynux - Fixes Practice Mode from the cmdline
        if Config.get("player0","mode_1p") == 1 and Config.get("game","players") == 1:
          self.player.practiceMode = True
        info = Song.loadSongInfo(self.engine, self.songName, library = self.libraryName)

      if self.engine.cmdPlay == 2:
        if len(info.difficulties) >= self.engine.cmdDiff:
          self.player.difficulty = info.difficulties[self.engine.cmdDiff]
        if len(info.parts) >= self.engine.cmdPart:
          self.player.part = info.parts[self.engine.cmdPart]
          
      # Make sure the difficulty we chose is available
      if not self.player.difficulty in info.difficulties:
        self.player.difficulty = info.difficulties[0]
      if not self.player.part in info.parts:
        self.player.part = info.parts[0]

      if not self.player.difficulty in info.difficulties:
        self.player.difficulty = info.difficulties[0]
      if not self.player.part in info.parts:
        self.player.part = info.parts[0]   
        
      self.session.world.deleteScene(self)
      self.session.world.createScene("GuitarScene", libraryName = self.libraryName, songName = self.songName, Players = players)
示例#19
0
  def render(self, visibility, topMost):
    self.engine.view.setViewport(1,0)
    SceneClient.render(self, visibility, topMost)
    
    bigFont = self.engine.data.bigFont
    font    = self.engine.data.font

    v = ((1 - visibility) ** 2)
    
    glEnable(GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glEnable(GL_COLOR_MATERIAL)

    self.engine.view.setOrthogonalProjection(normalize = True)
    try:
      t = self.time / 100
      w, h, = self.engine.view.geometry[2:4]
      r = .5
      if self.background:
        imgwidth = self.background.width1()
        wfactor = 640.000/imgwidth
        self.background.transform.reset()
        #self.background.transform.scale(1,-1)
        self.background.transform.scale(wfactor,-wfactor)
        self.background.transform.translate(w/2,h/2)
        self.background.draw()
      
      if self.showHighscores:
        for j,player in enumerate(self.playerList):
          #self.engine.view.setViewportHalf(len(self.playerList),j)
          scale = 0.0017
          endScroll = -.14
        
          if self.pauseScroll != None:
            self.offset = 0.0

          if self.pauseScroll > 0.5:
            self.pauseScroll = None
          if self.offset == None:
            self.offset = 0
            self.pauseScroll = 0
            self.nextHighScore()

          
          # evilynux - highscore
          if self.song is not None:
            text = _("%s High Scores for %s") % (self.scorePart, Dialogs.removeSongOrderPrefixFromName(self.song.info.name))
          else:
            text = _("%s High Scores") % self.scorePart
          w, h = font.getStringSize(text)

          Theme.setBaseColor(1 - v)
          font.render(text, (.5 - w / 2, .01 - v + self.offset))

          text = _("Difficulty: %s") % (self.scoreDifficulty)
          w, h = font.getStringSize(text)
          Theme.setBaseColor(1 - v)
          font.render(text, (.5 - w / 2, .01 - v + h + self.offset))
        
          x = .01
          y = .16 + v
          
        if self.song:
          i = -1
          for i, scores in enumerate(self.song.info.getHighscores(self.scoreDifficulty, part = self.scorePart)):
            score, stars, name, scores_ext = scores
            notesHit, notesTotal, noteStreak, modVersion, modOptions1, modOptions2 = scores_ext
            if stars == 6:
              stars = 5
              perfect = 1
            else:
              perfect = 0
            for j,player in enumerate(self.playerList):
              if (self.time % 10.0) < 5.0 and i == self.highscoreIndex[j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part:
                Theme.setSelectedColor(1 - v)
                break
              else:
                Theme.setBaseColor(1 - v)
            font.render("%d." % (i + 1), (x, y + self.offset),    scale = scale)
            if notesTotal != 0:
              score = "%s %.1f%%" % (score, (float(notesHit) / notesTotal) * 100.0)
            if noteStreak != 0:
              score = "%s (%d)" % (score, noteStreak)
            font.render(unicode(score), (x + .05, y + self.offset),   scale = scale)
            options = ""
            w2, h2 = font.getStringSize(options, scale = scale / 2)
            font.render(unicode(options), (.6 - w2, y + self.offset),   scale = scale / 2)
            # evilynux - Fixed star size following Font render bugfix
            if perfect == 1 and self.theme == 2:
              glColor3f(1, 1, 0) #racer: perfect is now gold for rock band
            font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale = scale * 1.8)
            if perfect == 1 and self.theme < 2:
              glColor3f(0, 1, 0) #racer: perfect is green for any non-RB theme
            font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale = scale * 1.8)
            for j,player in enumerate(self.playerList):
              if (self.time % 10.0) < 5.0 and i == self.highscoreIndex[j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part:
                Theme.setSelectedColor(1 - v)
                break
              else:
                Theme.setBaseColor(1 - v)
            font.render(name, (x + .8, y + self.offset), scale = scale)
            y += h
            endScroll -= .07
            
          if self.offset < endScroll or i == -1:
            self.offset = .8
            self.nextHighScore()
            endScroll = -0.14
          
        for j,player in enumerate(self.playerList): #MFH 
          if self.uploadingScores[j]:
            sScale = 0.001
            sW, sH = font.getStringSize("A", scale = sScale)
            sYPos = .7 - ( (sH * 1.25) * j)
            Theme.setBaseColor(1 - v)
            if self.highScoreResult[j] is None:
              upScoreText = _("Uploading Scores...")
              font.render("P%d (%s) %s" % (j+1, player.name, upScoreText), (.05, sYPos + v), scale = sScale)
            else:
              result = str(self.highScoreResult[j]).split(";")
              if len(result) > 0:
                upScoreText1 = _("Scores uploaded!")
                if result[0] == "True":
                  #MFH - display rank if it was successful
                  if len(result) > 1:
                    #font.render(_("Scores uploaded! ...your highscore ranks #" + result[1] + " on the world starpower chart!" ), (.05, .7 + v), scale = 0.001)
                    upScoreText2 = _("your highscore ranks")
                    upScoreText3 = _("on the world starpower chart!")
                    font.render("P%d (%s) %s %s  ...%s #%d %s" % (j+1, player.name, player.part.text, upScoreText1, upScoreText2, int(result[1]), upScoreText3), (.05, sYPos + v), scale = sScale)
                  else:
                    upScoreText2 = _("unknown rank.")
                    font.render("P%d (%s) %s %s  ... %s" % (j+1, player.name, player.part.text, upScoreText1, upScoreText2), (.05, sYPos + v), scale = sScale)
                else:
                  upScoreText2 = _("no new highscore.")
                  #font.render(_("Score upload failed!  World charts may be down."), (.05, .7 + v), scale = 0.001)
                  font.render("P%d (%s) %s %s  ...%s" % (j+1, player.name, player.part.text, upScoreText1, upScoreText2), (.05, sYPos + v), scale = sScale)
              else:
                upScoreText1 = _("Score upload failed!  World charts may be down.")
                font.render("P%d (%s) %s %s" % (j+1, player.name, player.part.text, upScoreText1), (.05, sYPos + v), scale = sScale)
        
        return
        



      #initial scoring - skipped after names entered
      Theme.setBaseColor(1 - v)
      if self.playerList[0].cheating:
        text = _("%s Cheated!") % Dialogs.removeSongOrderPrefixFromName(self.song.info.name)
      else:
        text = _("%s Finished!") % Dialogs.removeSongOrderPrefixFromName(self.song.info.name)
        w, h = font.getStringSize(text)
        Dialogs.wrapText(font, (.05, .045 - v), text)
        text = "%d/" % self.hits
        text2 = _("%d notes hit") % self.totalnotes
        text = text + text2
        w, h = font.getStringSize(text)
        Dialogs.wrapText(font, (.5 - w / 2, .54 - v - h), text)

      #MFH - TODO - add HOPO system & hit window display to this screen
      settingsScale = 0.0012
      settingsText = "HOPOs: %s, Hit Window: %s" % (self.hopoStyle, self.hitWindow)
      w, h = font.getStringSize(settingsText, settingsScale)
      font.render(settingsText, (.5 - w/2, 0.0), scale = settingsScale)
        
      for j,player in enumerate(self.playerList):
        if self.playerList[j].cheating:
          self.stars[j] = 0
          self.accuracy[j] = 0.0
    
        self.engine.view.setViewportHalf(len(self.playerList),j)
        text = "%d" % (player.score * self.anim(1000, 2000))
        w, h = bigFont.getStringSize(text)
        bigFont.render(text, (.5 - w / 2, .11 + v + (1.0 - self.anim(0, 1000) ** 3)), scale = 0.0025)
      
        if self.counter > 1000:
          scale = 0.0017
          if self.stars[j] == 6 and self.theme == 2: #racer: gold perfect for RB
            glColor3f(1, 1, 0)  
            text = (Data.STAR2 * (self.stars[j] - 1))
          elif self.stars[j] == 6 and self.theme < 2: #racer: green perfect for non-RB
            glColor3f(0, 1, 0)  
            text = (Data.STAR2 * (self.stars[j] - 1))
          else:
            text = (Data.STAR2 * self.stars[j] + Data.STAR1 * (5 - self.stars[j]))

          w, h = bigFont.getStringSize(Data.STAR1, scale = scale)
          x = .5 - w * len(text) / 2
          for i, ch in enumerate(text):
            bigFont.render(ch, (x + 100 * (1.0 - self.anim(1000 + i * 200, 1000 + (i + 1) * 200)) ** 2, .35 + v), scale = scale)
            x += w
      
        if self.counter > 2500:
          Theme.setBaseColor(1 - v)
          text = _("Accuracy: %.1f%%") % self.accuracy[j]
          w, h = font.getStringSize(text)
          font.render(text, (.5 - w / 2, .55 + v))
          text = _("Longest note streak: %d") % player.longestStreak
          w, h = font.getStringSize(text)
          font.render(text, (.5 - w / 2, .55 + h + v))
          if player.twoChord > 0:
            text = _("Part: %s on %s (2 chord)") % (player.part, player.difficulty)
          else:
            text = _("Part: %s on %s") % (player.part, player.difficulty)
          w, h = font.getStringSize(text)
          font.render(text, (.5 - w / 2, .55 + (2 * h)+ v))
      self.engine.view.setViewport(1,0)
    finally:
      self.engine.view.setViewport(1,0)
      self.engine.view.resetProjection()
示例#20
0
    def run(self, ticks):
        SceneClient.run(self, ticks)
        players = 1

        if not self.wizardStarted:
            self.wizardStarted = True

            if self.engine.cmdPlay == 1:
                self.songName = Config.get("game", "selected_song")
                self.libraryName = Config.get("game", "selected_library")
                self.engine.cmdPlay = 2

            if not self.songName:
                while True:
                    self.libraryName, self.songName = \
                      Dialogs.chooseSong(self.engine, \
                                         selectedLibrary = Config.get("game", "selected_library"),
                                         selectedSong    = Config.get("game", "selected_song"))

                    if self.libraryName == None:
                        newPath = Dialogs.chooseFile(
                            self.engine,
                            masks=["*/songs"],
                            prompt=_("Choose a new songs directory."),
                            dirSelect=True)
                        if newPath != None:
                            Config.set("game", "base_library",
                                       os.path.dirname(newPath))
                            Config.set("game", "selected_library", "songs")
                            Config.set("game", "selected_song", "")
                            self.engine.resource.refreshBaseLib(
                            )  #myfingershurt - to let user continue with new songpath without restart

                    if not self.songName:
                        self.session.world.finishGame()
                        return

                    if not self.tut:
                        Config.set("game", "selected_library",
                                   self.libraryName)
                        Config.set("game", "selected_song", self.songName)

                    info = Song.loadSongInfo(self.engine,
                                             self.songName,
                                             library=self.libraryName)

                    selected = False
                    escape = False
                    escaped = False

                    #while True:    #this nesting is now useless
                    #MFH - add "Practice" mode, which will activate a section selection menu before "part"
                    #racer: main menu instead of second menu practice

                    #self.player.practiceMode = Player.PracticeSet

                    #MFH - parameters for newLocalGame:
                    #players = -1 (party mode), 1, 2
                    #mode1p = 0 (quickplay), 1 (practice), 2 (career)
                    #mode2p = 0 (face-off), 1 (pro face-off)
                    #Config.define("game",   "players",             int,   1)
                    #Config.define("player0","mode_1p",           int,  0)
                    #Config.define("player1","mode_2p",           int,  0)

                    if Config.get("player0", "mode_1p") == 1 and Config.get(
                            "game", "players") == 1:  #practice mode
                        self.player.practiceMode = True
                    else:
                        self.player.practiceMode = False

                    slowDownDivisor = Config.get("audio", "speed_factor")

                    while True:  #new nesting for Practice Mode - section / start time selection
                        if self.player.practiceMode:
                            values, options = Config.getOptions(
                                "audio", "speed_factor")
                            if self.subMenuPosTuple:
                                slowdown = Dialogs.chooseItem(
                                    self.engine,
                                    options,
                                    "%s \n %s" %
                                    (Dialogs.removeSongOrderPrefixFromName(
                                        info.name), _("Speed Select:")),
                                    pos=self.subMenuPosTuple)
                            else:
                                slowdown = Dialogs.chooseItem(
                                    self.engine, options, "%s \n %s" %
                                    (Dialogs.removeSongOrderPrefixFromName(
                                        info.name), _("Speed Select:")))
                            for i in range(len(values)):
                                if options[i] == slowdown:
                                    Config.set("audio", "speed_factor",
                                               values[i])
                                    slowDownDivisor = values[i]
                                    break

                        if self.player.practiceMode and slowDownDivisor == 1:
                            #self.engine.resource.load(self, "song", lambda: Song.loadSong(self.engine, songName, library = self.libraryName, notesOnly = True, part = [player.part for player in self.playerList]), onLoad = self.songLoaded)

                            #startTime = Dialogs.chooseItem(self.engine, info.sections, "%s \n %s" % (info.name, _("Start Section:")))

                            sectionLabels = [
                                sLabel for sLabel, sPos in info.sections
                            ]

                            if self.subMenuPosTuple:
                                startLabel = Dialogs.chooseItem(
                                    self.engine,
                                    sectionLabels,
                                    "%s \n %s" %
                                    (Dialogs.removeSongOrderPrefixFromName(
                                        info.name), _("Start Section:")),
                                    pos=self.subMenuPosTuple)
                            else:
                                startLabel = Dialogs.chooseItem(
                                    self.engine, sectionLabels, "%s \n %s" %
                                    (Dialogs.removeSongOrderPrefixFromName(
                                        info.name), _("Start Section:")))

                            if startLabel:
                                Log.debug("Practice start section selected: " +
                                          startLabel)
                        else:
                            startLabel = "Gig"
                        if startLabel:
                            self.player.practiceSection = startLabel

                            #find start position in array:
                            self.player.startPos = [
                                sPos for sLabel, sPos in info.sections
                                if sLabel == startLabel
                            ]
                            Log.debug("Practice start position retrieved: " +
                                      str(self.player.startPos))

                        else:

                            #self.player.startPos = [0]

                            break
                        #if not self.player.practiceMode:
                        #selected = True  #this causes "gig" mode to start song with all defaults
                        #escape = True  #this causes "gig" mode to exit out to the song selection
                        #escaped = True  #this does nothing :(
                        #break;

                        while True:  #new nesting for Practice Mode selection

                            if len(info.parts) > 1:

                                if self.subMenuPosTuple:
                                    p = Dialogs.chooseItem(
                                        self.engine,
                                        info.parts,
                                        "%s \n %s" %
                                        (Dialogs.removeSongOrderPrefixFromName(
                                            info.name),
                                         _("Player 1 Choose a part:")),
                                        selected=self.player.part,
                                        pos=self.subMenuPosTuple)
                                else:
                                    p = Dialogs.chooseItem(
                                        self.engine,
                                        info.parts,
                                        "%s \n %s" %
                                        (Dialogs.removeSongOrderPrefixFromName(
                                            info.name),
                                         _("Player 1 Choose a part:")),
                                        selected=self.player.part)

                            else:
                                p = info.parts[0]
                            if p:
                                self.player.part = p
                            else:
                                if not self.player.practiceMode:
                                    escaped = True
                                break
                            while True:
                                if len(info.difficulties) > 1:

                                    if self.subMenuPosTuple:
                                        d = Dialogs.chooseItem(
                                            self.engine,
                                            info.difficulties,
                                            "%s \n %s" %
                                            (Dialogs.
                                             removeSongOrderPrefixFromName(
                                                 info.name),
                                             _("Player 1 Choose a difficulty:")
                                             ),
                                            selected=self.player.difficulty,
                                            pos=self.subMenuPosTuple)
                                    else:
                                        d = Dialogs.chooseItem(
                                            self.engine,
                                            info.difficulties,
                                            "%s \n %s" %
                                            (Dialogs.
                                             removeSongOrderPrefixFromName(
                                                 info.name),
                                             _("Player 1 Choose a difficulty:")
                                             ),
                                            selected=self.player.difficulty)

                                else:
                                    d = info.difficulties[0]
                                if d:
                                    self.player.difficulty = d
                                else:
                                    if len(info.parts) <= 1:
                                        #escape = True
                                        escaped = True
                                    break
                                while True:
                                    if self.engine.config.get(
                                            "game", "players") > 1:
                                        #p = Dialogs.chooseItem(self.engine, info.parts + ["Party Mode"] + ["No Player 2"], "%s \n %s" % (info.name, _("Player 2 Choose a part:")), selected = self.player2.part)

                                        if self.subMenuPosTuple:
                                            p = Dialogs.chooseItem(
                                                self.engine,
                                                info.parts,
                                                "%s \n %s" %
                                                (Dialogs.
                                                 removeSongOrderPrefixFromName(
                                                     info.name),
                                                 _("Player 2 Choose a part:")),
                                                selected=self.player2.part,
                                                pos=self.subMenuPosTuple)
                                        else:
                                            p = Dialogs.chooseItem(
                                                self.engine,
                                                info.parts,
                                                "%s \n %s" %
                                                (Dialogs.
                                                 removeSongOrderPrefixFromName(
                                                     info.name),
                                                 _("Player 2 Choose a part:")),
                                                selected=self.player2.part)

                                        #if p and p == "No Player 2":
                                        #  players = 1
                                        #  selected = True
                                        #  self.player2.part = p
                                        #  break
                                        #elif p and p == "Party Mode":
                                        #  players = -1
                                        #  selected = True
                                        #  self.player2.part = p
                                        #  break
                                        #elif p and p != "No Player 2" and p != "Party Mode":
                                        if p:
                                            players = 2
                                            self.player2.part = p

                                        else:
                                            if len(info.difficulties) <= 1:
                                                escaped = True
                                            if len(info.parts) <= 1:
                                                escape = True
                                            break
                                        while True:
                                            if len(info.difficulties) > 1:

                                                if self.subMenuPosTuple:
                                                    d = Dialogs.chooseItem(
                                                        self.engine,
                                                        info.difficulties,
                                                        "%s \n %s" %
                                                        (Dialogs.
                                                         removeSongOrderPrefixFromName(
                                                             info.name),
                                                         _("Player 2 Choose a difficulty:"
                                                           )),
                                                        selected=self.player2.
                                                        difficulty,
                                                        pos=self.
                                                        subMenuPosTuple)
                                                else:
                                                    d = Dialogs.chooseItem(
                                                        self.engine,
                                                        info.difficulties,
                                                        "%s \n %s" %
                                                        (Dialogs.
                                                         removeSongOrderPrefixFromName(
                                                             info.name),
                                                         _("Player 2 Choose a difficulty:"
                                                           )),
                                                        selected=self.player2.
                                                        difficulty)

                                            else:
                                                d = info.difficulties[0]
                                            if d:
                                                self.player2.difficulty = d
                                            else:
                                                break
                                            selected = True
                                            break
                                    else:
                                        selected = True
                                        break
                                    if selected:
                                        break
                                if selected or escaped:
                                    break

                            #if selected or escaped: #new nesting for Practice Mode selection
                            if selected or escaped:  #new nesting for Practice Mode selection
                                break

                        if selected or escaped:  #new nesting for Practice Mode section selection
                            break

                    #useless practice mode nesting
                    #if selected or escape:
                    #  break

                    if (not selected) or escape:
                        continue
                    break
            else:
                #evilynux - Fixes Practice Mode from the cmdline
                if Config.get("player0", "mode_1p") == 1 and Config.get(
                        "game", "players") == 1:
                    self.player.practiceMode = True
                info = Song.loadSongInfo(self.engine,
                                         self.songName,
                                         library=self.libraryName)

            if self.engine.cmdPlay == 2:
                if len(info.difficulties) >= self.engine.cmdDiff:
                    self.player.difficulty = info.difficulties[
                        self.engine.cmdDiff]
                if len(info.parts) >= self.engine.cmdPart:
                    self.player.part = info.parts[self.engine.cmdPart]

            # Make sure the difficulty we chose is available
            if not self.player.difficulty in info.difficulties:
                self.player.difficulty = info.difficulties[0]
            if not self.player.part in info.parts:
                self.player.part = info.parts[0]

            if not self.player.difficulty in info.difficulties:
                self.player.difficulty = info.difficulties[0]
            if not self.player.part in info.parts:
                self.player.part = info.parts[0]

            if not self.engine.createdGuitarScene:
                #self.engine.createdGuitarScene = True
                self.session.world.deleteScene(self)
                self.session.world.createScene("GuitarScene",
                                               libraryName=self.libraryName,
                                               songName=self.songName,
                                               Players=players)
示例#21
0
    def render(self, visibility, topMost):
        SceneClient.render(self, visibility, topMost)

        font    = self.engine.data.font
        bigFont = self.engine.data.bigFont

        self.visibility = v = 1.0 - ((1 - visibility) ** 2)

        self.engine.view.setOrthogonalProjection(normalize = True)
        try:
            # show countdown
            if self.countdown > 1:
                Theme.setBaseColor(min(1.0, 3.0 - abs(4.0 - self.countdown)))
                text = _("Get Ready to Rock")
                w, h = font.getStringSize(text)
                font.render(text,  (.5 - w / 2, .3))
                if self.countdown < 6:
                    scale = 0.002 + 0.0005 * (self.countdown % 1) ** 3
                    text = "%d" % (self.countdown)
                    w, h = bigFont.getStringSize(text, scale = scale)
                    Theme.setSelectedColor()
                    bigFont.render(text,  (.5 - w / 2, .45 - h / 2), scale = scale)

            w, h = font.getStringSize(" ")
            y = .05 - h / 2 - (1.0 - v) * .2

            # show song name
            if self.countdown and self.song:
                Theme.setBaseColor(min(1.0, 4.0 - abs(4.0 - self.countdown)))
                Dialogs.wrapText(font, (.05, .05 - h / 2), self.song.info.name + " \n " + self.song.info.artist, rightMargin = .6, scale = 0.0015)

            Theme.setSelectedColor()

            font.render("%d" % (self.player.score + self.getExtraScoreForCurrentlyPlayedNotes()),  (.6, y))
            font.render("%dx" % self.player.getScoreMultiplier(), (.6, y + h))

            # show the streak counter and miss message
            if self.player.streak > 0 and self.song:
                text = _("%d hit") % self.player.streak
                factor = 0.0
                if self.lastPickPos:
                    diff = self.getSongPosition() - self.lastPickPos
                    if diff > 0 and diff < self.song.period * 2:
                        factor = .25 * (1.0 - (diff / (self.song.period * 2))) ** 2
                factor = (1.0 + factor) * 0.002
                tw, th = font.getStringSize(text, scale = factor)
                font.render(text, (.16 - tw / 2, y + h / 2 - th / 2), scale = factor)
            elif self.lastPickPos is not None and self.countdown <= 0:
                diff = self.getSongPosition() - self.lastPickPos
                alpha = 1.0 - diff * 0.005
                if alpha > .1:
                    Theme.setSelectedColor(alpha)
                    glPushMatrix()
                    glTranslate(.1, y + 0.000005 * diff ** 2, 0)
                    glRotatef(math.sin(self.lastPickPos) * 25, 0, 0, 1)
                    font.render(_("Missed!"), (0, 0))
                    glPopMatrix()

            # show the streak balls
            if self.player.streak >= 30:
                glColor3f(.5, .5, 1)
            elif self.player.streak >= 20:
                glColor3f(1, 1, .5)
            elif self.player.streak >= 10:
                glColor3f(1, .5, .5)
            else:
                glColor3f(.5, 1, .5)

            s = min(39, self.player.streak) % 10 + 1
            font.render(Data.BALL2 * s + Data.BALL1 * (10 - s),   (.67, y + h * 1.3), scale = 0.0011)

            # show multiplier changes
            if self.song and self.lastMultTime is not None:
                diff = self.getSongPosition() - self.lastMultTime
                if diff > 0 and diff < self.song.period * 2:
                    m = self.player.getScoreMultiplier()
                    c = (1, 1, 1)
                    if self.player.streak >= 40:
                        texture = None
                    elif m == 1:
                        texture = None
                    elif m == 2:
                        texture = self.fx2x.texture
                        c = (1, .5, .5)
                    elif m == 3:
                        texture = self.fx3x.texture
                        c = (1, 1, .5)
                    elif m == 4:
                        texture = self.fx4x.texture
                        c = (.5, .5, 1)

                    f = (1.0 - abs(self.song.period * 1 - diff) / (self.song.period * 1)) ** 2

                    # Flash the screen
                    glBegin(GL_TRIANGLE_STRIP)
                    glColor4f(c[0], c[1], c[2], (f - .5) * 1)
                    glVertex2f(0, 0)
                    glColor4f(c[0], c[1], c[2], (f - .5) * 1)
                    glVertex2f(1, 0)
                    glColor4f(c[0], c[1], c[2], (f - .5) * .25)
                    glVertex2f(0, 1)
                    glColor4f(c[0], c[1], c[2], (f - .5) * .25)
                    glVertex2f(1, 1)
                    glEnd()

                    if texture:
                        glPushMatrix()
                        glEnable(GL_TEXTURE_2D)
                        texture.bind()
                        size = (texture.pixelSize[0] * .002, texture.pixelSize[1] * .002)

                        glTranslatef(.5, .15, 0)
                        glBlendFunc(GL_SRC_ALPHA, GL_ONE)

                        f = .5 + .5 * (diff / self.song.period) ** 3
                        glColor4f(1, 1, 1, min(1, 2 - f))
                        glBegin(GL_TRIANGLE_STRIP)
                        glTexCoord2f(0.0, 0.0)
                        glVertex2f(-size[0] * f, -size[1] * f)
                        glTexCoord2f(1.0, 0.0)
                        glVertex2f( size[0] * f, -size[1] * f)
                        glTexCoord2f(0.0, 1.0)
                        glVertex2f(-size[0] * f,  size[1] * f)
                        glTexCoord2f(1.0, 1.0)
                        glVertex2f( size[0] * f,  size[1] * f)
                        glEnd()

                        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
                        glPopMatrix()

            # show the comments
            if self.song and self.song.info.tutorial:
                glColor3f(1, 1, 1)
                pos = self.getSongPosition()
                for time, event in self.song.track.getEvents(pos - self.song.period * 2, pos + self.song.period * 4):
                    if isinstance(event, PictureEvent):
                        if pos < time or pos > time + event.length:
                            continue

                        try:
                            picture = event.picture
                        except:
                            self.engine.loadImgDrawing(event, "picture", os.path.join(self.libraryName, self.songName, event.fileName))
                            picture = event.picture

                        w, h, = self.engine.view.geometry[2:4]
                        fadePeriod = 500.0
                        f = (1.0 - min(1.0, abs(pos - time) / fadePeriod) * min(1.0, abs(pos - time - event.length) / fadePeriod)) ** 2
                        picture.transform.reset()
                        picture.transform.translate(w / 2, (f * -2 + 1) * h / 2)
                        picture.transform.scale(1, -1)
                        picture.draw()
                    elif isinstance(event, TextEvent):
                        if pos >= time and pos <= time + event.length:
                            text = _(event.text)
                            w, h = font.getStringSize(text)
                            font.render(text, (.5 - w / 2, .67))
        finally:
            self.engine.view.resetProjection()
  def run(self, ticks):
    SceneClient.run(self, ticks)
    players = 1

    if not self.wizardStarted:
      self.wizardStarted = True


      if self.engine.cmdPlay == 1:
        self.songName = Config.get("game", "selected_song")
        self.libraryName = Config.get("game", "selected_library")
        self.engine.cmdPlay = 2
        
      if not self.songName:
        while True:
          self.libraryName, self.songName = \
            Dialogs.chooseSong(self.engine, \
                               selectedLibrary = Config.get("game", "selected_library"),
                               selectedSong    = Config.get("game", "selected_song"))

          if self.libraryName == None:
            newPath = Dialogs.chooseFile(self.engine, masks = ["*/songs"], prompt = _("Choose a new songs directory."), dirSelect = True)
            if newPath != None:
              Config.set("game", "base_library", os.path.dirname(newPath))
              Config.set("game", "selected_library", "songs")
              Config.set("game", "selected_song", "")
            
          if not self.songName:
            self.session.world.finishGame()
            return

          Config.set("game", "selected_library", self.libraryName)
          Config.set("game", "selected_song",    self.songName)
          
          info = Song.loadSongInfo(self.engine, self.songName, library = self.libraryName)

          selected = False
          escape = False
          escaped = False
          while True:
            if len(info.parts) > 1:
              p = Dialogs.chooseItem(self.engine, info.parts, "%s \n %s" % (info.name, _("Player 1 Choose a part:")), selected = self.player.part)
            else:
              p = info.parts[0]
            if p:
              self.player.part = p
            else:
              break;
            while True:
              if len(info.difficulties) > 1:
                d = Dialogs.chooseItem(self.engine, info.difficulties,
                                     "%s \n %s" % (info.name, _("Player 1 Choose a difficulty:")), selected = self.player.difficulty)
              else:
                d = info.difficulties[0]
              if d:
                self.player.difficulty = d
              else:
                if len(info.parts) <= 1:
                  escape = True
                break
              while True:
                if self.engine.config.get("game", "players") > 1:               
                  p = Dialogs.chooseItem(self.engine, info.parts + ["Party Mode"] + ["No Player 2"], "%s \n %s" % (info.name, _("Player 2 Choose a part:")), selected = self.player2.part)
                  if p and p == "No Player 2":
                    players = 1
                    selected = True
                    self.player2.part = p
                    break
                  elif p and p == "Party Mode":
                    players = -1
                    selected = True
                    self.player2.part = p
                    break
                  elif p and p != "No Player 2" and p != "Party Mode":
                    players = 2
                    self.player2.part = p

                  else:
                    if len(info.difficulties) <= 1:
                      escaped = True
                    if len(info.parts) <= 1:
                      escape = True
                    break
                  while True:                    
                    if len(info.difficulties) > 1:
                      d = Dialogs.chooseItem(self.engine, info.difficulties, "%s \n %s" % (info.name, _("Player 2 Choose a difficulty:")), selected = self.player2.difficulty)
                    else:
                      d = info.difficulties[0]
                    if d:
                      self.player2.difficulty = d
                    else:
                      break
                    selected = True
                    break
                else:
                  selected = True
                  break
                if selected:
                  break
              if selected or escaped:
                break
            if selected or escape:
              break

          if (not selected) or escape:
            continue
          break
      else:
        info = Song.loadSongInfo(self.engine, self.songName, library = self.libraryName)

      if self.engine.cmdPlay == 2:
        if len(info.difficulties) >= self.engine.cmdDiff:
          self.player.difficulty = info.difficulties[self.engine.cmdDiff]
        if len(info.parts) >= self.engine.cmdPart:
          self.player.part = info.parts[self.engine.cmdPart]
          
      # Make sure the difficulty we chose is available
      if not self.player.difficulty in info.difficulties:
        self.player.difficulty = info.difficulties[0]
      if not self.player.part in info.parts:
        self.player.part = info.parts[0]

      if not self.player.difficulty in info.difficulties:
        self.player.difficulty = info.difficulties[0]
      if not self.player.part in info.parts:
        self.player.part = info.parts[0]   
        
      self.session.world.deleteScene(self)
      self.session.world.createScene("GuitarScene", libraryName = self.libraryName, songName = self.songName, Players = players)
示例#23
0
    def run(self, ticks):
        SceneClient.run(self, ticks)
        players = 1

        if not self.wizardStarted:
            self.wizardStarted = True

            if not self.songName:
                while 1:
                    if self.engine.cmdPlay == 2:
                        self.songName = Config.get("game", "selected_song")
                        self.libraryName = Config.get("game",
                                                      "selected_library")
                    else:
                        self.mode = 1
                        self.libraryName, self.songName = \
                          Dialogs.chooseSong(self.engine, \
                                           selectedLibrary = Config.get("game", "selected_library"),
                                           selectedSong    = Config.get("game", "selected_song"))

                        if self.libraryName == None:
                            newPath = Dialogs.chooseFile(
                                self.engine,
                                masks=["*/songs"],
                                prompt=_("Choose a new songs directory."),
                                dirSelect=True)
                            if newPath != None:
                                Config.set("game", "base_library",
                                           os.path.dirname(newPath))
                                Config.set("game", "selected_library", "songs")
                                Config.set("game", "selected_song", "")
                                self.engine.resource.refreshBaseLib(
                                )  #myfingershurt - to let user continue with new songpath without restart

                        if not self.songName:
                            self.session.world.finishGame()
                            return

                    if not self.tut:
                        Config.set("game", "selected_library",
                                   self.libraryName)
                        Config.set("game", "selected_song", self.songName)
                    self.mode = 2
                    info = Song.loadSongInfo(self.engine,
                                             self.songName,
                                             library=self.libraryName)

                    selected = False
                    escape = False
                    escaped = False

                    #while True:    #this nesting is now useless
                    #MFH - add "Practice" mode, which will activate a section selection menu before "part"
                    #racer: main menu instead of second menu practice

                    #self.player.practiceMode = Player.PracticeSet

                    #MFH - parameters for newLocalGame:
                    #players = -1 (party mode), 1, 2
                    #mode1p = 0 (quickplay), 1 (practice), 2 (career)
                    #mode2p = 0 (face-off), 1 (pro face-off)
                    #Config.define("game",   "players",             int,   1)
                    #Config.define("game","game_mode",           int,  0)
                    #Config.define("game","multiplayer_mode",           int,  0)

                    if Config.get("game", "game_mode") == 1 and Config.get(
                            "game", "players") == 1:  #practice mode
                        self.player.practiceMode = True
                    else:
                        self.player.practiceMode = False

                    slowDownDivisor = Config.get("audio", "speed_factor")

                    while 1:  #new nesting for Practice Mode - section / start time selection
                        if self.player.practiceMode:
                            values, options = Config.getOptions(
                                "audio", "speed_factor")
                            if self.subMenuPosTuple:
                                slowdown = Dialogs.chooseItem(
                                    self.engine,
                                    options,
                                    "%s \n %s" %
                                    (Dialogs.removeSongOrderPrefixFromName(
                                        info.name), _("Speed Select:")),
                                    pos=self.subMenuPosTuple)
                            else:
                                slowdown = Dialogs.chooseItem(
                                    self.engine, options, "%s \n %s" %
                                    (Dialogs.removeSongOrderPrefixFromName(
                                        info.name), _("Speed Select:")))
                            for i in range(len(values)):
                                if options[i] == slowdown:
                                    self.player.practiceSpeed = values[i]
                                    slowDownDivisor = values[i]
                                    break

                        if self.player.practiceMode and slowDownDivisor == 1:
                            #self.engine.resource.load(self, "song", lambda: Song.loadSong(self.engine, songName, library = self.libraryName, notesOnly = True, part = [player.part for player in self.playerList]), onLoad = self.songLoaded)

                            #startTime = Dialogs.chooseItem(self.engine, info.sections, "%s \n %s" % (info.name, _("Start Section:")))

                            sectionLabels = [
                                sLabel for sLabel, sPos in info.sections
                            ]

                            if self.subMenuPosTuple:
                                startLabel = Dialogs.chooseItem(
                                    self.engine,
                                    sectionLabels,
                                    "%s \n %s" %
                                    (Dialogs.removeSongOrderPrefixFromName(
                                        info.name), _("Start Section:")),
                                    pos=self.subMenuPosTuple)
                            else:
                                startLabel = Dialogs.chooseItem(
                                    self.engine, sectionLabels, "%s \n %s" %
                                    (Dialogs.removeSongOrderPrefixFromName(
                                        info.name), _("Start Section:")))

                            if startLabel:
                                Log.debug("Practice start section selected: " +
                                          startLabel)
                        else:
                            startLabel = "Gig"
                        if startLabel:
                            self.player.practiceSection = startLabel

                            #find start position in array:
                            try:
                                tempStart = [
                                    sPos for sLabel, sPos in info.sections
                                    if sLabel == startLabel
                                ]
                                if tempStart == []:
                                    self.player.startPos = 0.0
                                else:
                                    self.player.startPos = tempStart[0]
                                Log.debug(
                                    "Practice start position retrieved: " +
                                    str(self.player.startPos))
                            except:
                                Log.error("Cannot retrieve start position!")
                                self.player.startPos = 0.0
                                break
                        else:
                            #self.player.startPos = 0.0

                            break
                        #if not self.player.practiceMode:
                        #selected = True  #this causes "gig" mode to start song with all defaults
                        #escape = True  #this causes "gig" mode to exit out to the song selection
                        #escaped = True  #this does nothing :(
                        #break;

                        guitars = []
                        drums = []
                        vocals = []
                        autoPart = None
                        for part in info.parts:
                            if part.id == 4:
                                drums.append(part)
                            elif part.id == 5:
                                vocals.append(part)
                            else:
                                guitars.append(part)
                            if self.engine.cmdPlay == 2 and self.engine.cmdPart is not None and len(
                                    self.playerList) == 1:
                                if self.engine.cmdPart == part.id:
                                    Log.debug("Command-line mode: Part found!")
                                    if part.id == 4 and self.engine.input.gameDrums > 0:
                                        autoPart = part.id
                                    elif part.id == 5 and self.engine.input.gameMics > 0:
                                        autoPart = part.id
                                    elif self.engine.input.gameGuitars > 0:
                                        autoPart = part.id
                        if autoPart is None:
                            if len(drums
                                   ) == 0 and self.engine.input.gameDrums > 0:
                                Dialogs.showMessage(
                                    self.engine,
                                    _("There are no drum parts in this song. Change your controllers to play."
                                      ))
                                escaped = True
                                if self.engine.cmdPlay == 2:
                                    self.engine.cmdPlay = 0
                                break
                            if len(
                                    guitars
                            ) == 0 and self.engine.input.gameGuitars > 0:
                                Dialogs.showMessage(
                                    self.engine,
                                    _("There are no guitar parts in this song. Change your controllers to play."
                                      ))
                                escaped = True
                                if self.engine.cmdPlay == 2:
                                    self.engine.cmdPlay = 0
                                break
                            if len(vocals
                                   ) == 0 and self.engine.input.gameMics > 0:
                                Dialogs.showMessage(
                                    self.engine,
                                    _("There are no vocal parts in this song. Change your controllers to play."
                                      ))
                                escaped = True
                                if self.engine.cmdPlay == 2:
                                    self.engine.cmdPlay = 0
                                break

                            for i, player in enumerate(self.playerList):

                                while 1:  #new nesting for Practice Mode selection
                                    selectedPlayer = False
                                    choose = []
                                    if player.controlType == 2 or player.controlType == 3:
                                        choose = drums
                                    elif player.controlType == 5:
                                        choose = vocals
                                    else:
                                        choose = guitars

                                    if len(choose) > 1:

                                        if self.subMenuPosTuple:
                                            p = Dialogs.chooseItem(
                                                self.engine,
                                                choose,
                                                "%s \n %s" %
                                                (Dialogs.
                                                 removeSongOrderPrefixFromName(
                                                     info.name),
                                                 _("%s Choose a part:") %
                                                 player.name),
                                                selected=player.part,
                                                pos=self.subMenuPosTuple)
                                        else:
                                            p = Dialogs.chooseItem(
                                                self.engine,
                                                choose,
                                                "%s \n %s" %
                                                (Dialogs.
                                                 removeSongOrderPrefixFromName(
                                                     info.name),
                                                 _("%s Choose a part:") %
                                                 player.name),
                                                selected=player.part)

                                    else:
                                        p = choose[0]
                                    if p:
                                        player.part = p
                                    else:
                                        if not player.practiceMode:
                                            escaped = True
                                        break
                                    while 1:
                                        if len(info.partDifficulties[
                                                p.id]) > 1:

                                            if self.subMenuPosTuple:
                                                d = Dialogs.chooseItem(
                                                    self.engine,
                                                    info.partDifficulties[
                                                        p.id],
                                                    "%s \n %s" %
                                                    (Dialogs.
                                                     removeSongOrderPrefixFromName(
                                                         info.name),
                                                     _("%s Choose a difficulty:"
                                                       ) % player.name),
                                                    selected=player.difficulty,
                                                    pos=self.subMenuPosTuple)
                                            else:
                                                d = Dialogs.chooseItem(
                                                    self.engine,
                                                    info.partDifficulties[
                                                        p.id],
                                                    "%s \n %s" %
                                                    (Dialogs.
                                                     removeSongOrderPrefixFromName(
                                                         info.name),
                                                     _("%s Choose a difficulty:"
                                                       ) % player.name),
                                                    selected=player.difficulty)

                                        else:
                                            d = info.partDifficulties[p.id][0]
                                        if d:
                                            player.difficulty = d
                                            selectedPlayer = True
                                        else:
                                            if len(choose) <= 1:
                                                #escape = True
                                                escaped = True
                                            break
                                        if selectedPlayer:
                                            break
                                    if selectedPlayer or escaped:
                                        break

                                #if selected or escaped: #new nesting for Practice Mode selection
                                if selected or escaped:  #new nesting for Practice Mode selection
                                    break

                            else:
                                selected = True

                            if selected or escaped:  #new nesting for Practice Mode section selection
                                break

                        else:
                            self.playerList[0].part = Song.parts[autoPart]
                            for diff in info.partDifficulties[autoPart]:
                                if self.engine.cmdDiff == diff.id:
                                    self.playerList[0].difficulty = diff
                                    break
                            else:
                                self.playerList[
                                    0].difficulty = info.partDifficulties[
                                        autoPart][0]
                            selected = True
                            break

                    #useless practice mode nesting
                    #if selected or escape:
                    #  break

                    if (not selected) or escape:
                        continue
                    break
            else:
                #evilynux - Fixes Practice Mode from the cmdline
                if Config.get("game", "game_mode") == 1 and Config.get(
                        "game", "players") == 1:
                    self.player.practiceMode = True
                info = Song.loadSongInfo(self.engine,
                                         self.songName,
                                         library=self.libraryName)

            if self.engine.cmdPlay == 3:
                if len(info.parts) >= self.engine.cmdPart:
                    self.player.part = info.parts[self.engine.cmdPart]
                if len(info.partDifficulties[
                        self.player.part.id]) >= self.engine.cmdDiff:
                    self.player.difficulty = info.partDifficulties[
                        self.player.part.id][self.engine.cmdDiff]

            # Make sure the difficulty we chose is available
            if not self.player.part in info.parts:
                self.player.part = info.parts[0]
            if not self.player.difficulty in info.partDifficulties[
                    self.player.part.id]:
                self.player.difficulty = info.partDifficulties[
                    self.player.part.id][0]

            if not self.engine.createdGuitarScene:
                if self.engine.cmdPlay > 0:
                    self.engine.cmdPlay = 3
                #self.engine.createdGuitarScene = True
                self.session.world.deleteScene(self)
                self.session.world.createScene("GuitarScene",
                                               libraryName=self.libraryName,
                                               songName=self.songName,
                                               Players=players)
示例#24
0
 def hidden(self):
   SceneClient.hidden(self)
   if self.nextScene:
     self.nextScene()
示例#25
0
    def render(self, visibility, topMost):
        SceneClient.render(self, visibility, topMost)

        font = self.engine.data.font
        bigFont = self.engine.data.bigFont

        self.visibility = v = 1.0 - ((1 - visibility)**2)

        self.engine.view.setOrthogonalProjection(normalize=True)
        try:
            # show countdown
            if self.countdown > 1:
                Theme.setBaseColor(min(1.0, 3.0 - abs(4.0 - self.countdown)))
                text = _("Get Ready to Rock")
                w, h = font.getStringSize(text)
                font.render(text, (.5 - w / 2, .3))
                if self.countdown < 6:
                    scale = 0.002 + 0.0005 * (self.countdown % 1)**3
                    text = "%d" % (self.countdown)
                    w, h = bigFont.getStringSize(text, scale=scale)
                    Theme.setSelectedColor()
                    bigFont.render(text, (.5 - w / 2, .45 - h / 2),
                                   scale=scale)

            w, h = font.getStringSize(" ")
            y = .05 - h / 2 - (1.0 - v) * .2

            # show song name
            if self.countdown and self.song:
                Theme.setBaseColor(min(1.0, 4.0 - abs(4.0 - self.countdown)))
                Dialogs.wrapText(font, (.05, .05 - h / 2),
                                 self.song.info.name + " \n " +
                                 self.song.info.artist,
                                 rightMargin=.6,
                                 scale=0.0015)

            Theme.setSelectedColor()

            font.render(
                "%d" % (self.player.score +
                        self.getExtraScoreForCurrentlyPlayedNotes()), (.6, y))
            font.render("%dx" % self.player.getScoreMultiplier(), (.6, y + h))

            # show the streak counter and miss message
            if self.player.streak > 0 and self.song:
                text = _("%d hit") % self.player.streak
                factor = 0.0
                if self.lastPickPos:
                    diff = self.getSongPosition() - self.lastPickPos
                    if diff > 0 and diff < self.song.period * 2:
                        factor = .25 * (1.0 - (diff /
                                               (self.song.period * 2)))**2
                factor = (1.0 + factor) * 0.002
                tw, th = font.getStringSize(text, scale=factor)
                font.render(text, (.16 - tw / 2, y + h / 2 - th / 2),
                            scale=factor)
            elif self.lastPickPos is not None and self.countdown <= 0:
                diff = self.getSongPosition() - self.lastPickPos
                alpha = 1.0 - diff * 0.005
                if alpha > .1:
                    Theme.setSelectedColor(alpha)
                    glPushMatrix()
                    glTranslate(.1, y + 0.000005 * diff**2, 0)
                    glRotatef(math.sin(self.lastPickPos) * 25, 0, 0, 1)
                    font.render(_("Missed!"), (0, 0))
                    glPopMatrix()

            # show the streak balls
            if self.player.streak >= 30:
                glColor3f(.5, .5, 1)
            elif self.player.streak >= 20:
                glColor3f(1, 1, .5)
            elif self.player.streak >= 10:
                glColor3f(1, .5, .5)
            else:
                glColor3f(.5, 1, .5)

            s = min(39, self.player.streak) % 10 + 1
            font.render(Data.BALL2 * s + Data.BALL1 * (10 - s),
                        (.67, y + h * 1.3),
                        scale=0.0011)

            # show multiplier changes
            if self.song and self.lastMultTime is not None:
                diff = self.getSongPosition() - self.lastMultTime
                if diff > 0 and diff < self.song.period * 2:
                    m = self.player.getScoreMultiplier()
                    c = (1, 1, 1)
                    if self.player.streak >= 40:
                        texture = None
                    elif m == 1:
                        texture = None
                    elif m == 2:
                        texture = self.fx2x.texture
                        c = (1, .5, .5)
                    elif m == 3:
                        texture = self.fx3x.texture
                        c = (1, 1, .5)
                    elif m == 4:
                        texture = self.fx4x.texture
                        c = (.5, .5, 1)

                    f = (1.0 - abs(self.song.period * 1 - diff) /
                         (self.song.period * 1))**2

                    # Flash the screen
                    glBegin(GL_TRIANGLE_STRIP)
                    glColor4f(c[0], c[1], c[2], (f - .5) * 1)
                    glVertex2f(0, 0)
                    glColor4f(c[0], c[1], c[2], (f - .5) * 1)
                    glVertex2f(1, 0)
                    glColor4f(c[0], c[1], c[2], (f - .5) * .25)
                    glVertex2f(0, 1)
                    glColor4f(c[0], c[1], c[2], (f - .5) * .25)
                    glVertex2f(1, 1)
                    glEnd()

                    if texture:
                        glPushMatrix()
                        glEnable(GL_TEXTURE_2D)
                        texture.bind()
                        size = (texture.pixelSize[0] * .002,
                                texture.pixelSize[1] * .002)

                        glTranslatef(.5, .15, 0)
                        glBlendFunc(GL_SRC_ALPHA, GL_ONE)

                        f = .5 + .5 * (diff / self.song.period)**3
                        glColor4f(1, 1, 1, min(1, 2 - f))
                        glBegin(GL_TRIANGLE_STRIP)
                        glTexCoord2f(0.0, 0.0)
                        glVertex2f(-size[0] * f, -size[1] * f)
                        glTexCoord2f(1.0, 0.0)
                        glVertex2f(size[0] * f, -size[1] * f)
                        glTexCoord2f(0.0, 1.0)
                        glVertex2f(-size[0] * f, size[1] * f)
                        glTexCoord2f(1.0, 1.0)
                        glVertex2f(size[0] * f, size[1] * f)
                        glEnd()

                        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
                        glPopMatrix()

            # show the comments
            if self.song and self.song.info.tutorial:
                glColor3f(1, 1, 1)
                pos = self.getSongPosition()
                for time, event in self.song.track.getEvents(
                        pos - self.song.period * 2,
                        pos + self.song.period * 4):
                    if isinstance(event, PictureEvent):
                        if pos < time or pos > time + event.length:
                            continue

                        try:
                            picture = event.picture
                        except:
                            self.engine.loadSvgDrawing(
                                event, "picture",
                                os.path.join(self.libraryName, self.songName,
                                             event.fileName))
                            picture = event.picture

                        w, h, = self.engine.view.geometry[2:4]
                        fadePeriod = 500.0
                        f = (1.0 - min(1.0,
                                       abs(pos - time) / fadePeriod) *
                             min(1.0,
                                 abs(pos - time - event.length) / fadePeriod)
                             )**2
                        picture.transform.reset()
                        picture.transform.translate(w / 2,
                                                    (f * -2 + 1) * h / 2)
                        picture.transform.scale(1, -1)
                        picture.draw()
                    elif isinstance(event, TextEvent):
                        if pos >= time and pos <= time + event.length:
                            text = _(event.text)
                            w, h = font.getStringSize(text)
                            font.render(text, (.5 - w / 2, .67))
        finally:
            self.engine.view.resetProjection()
示例#26
0
  def render(self, visibility, topMost):
    self.engine.view.setViewport(1,0)
    SceneClient.render(self, visibility, topMost)
    
    bigFont = self.engine.data.bigFont
    font    = self.engine.data.font

    v = ((1 - visibility) ** 2)
    
    glEnable(GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glEnable(GL_COLOR_MATERIAL)

    self.engine.view.setOrthogonalProjection(normalize = True)
    try:
      t = self.time / 100
      w, h, = self.engine.view.geometry[2:4]
      r = .5
      if self.background:
        imgwidth = self.background.width1()
        wfactor = 640.000/imgwidth
        self.background.transform.reset()
        #self.background.transform.scale(1,-1)
        self.background.transform.scale(wfactor,-wfactor)
        self.background.transform.translate(w/2,h/2)
        self.background.draw()
      
      if self.showHighscores:
        for j,player in enumerate(self.playerList):
          #self.engine.view.setViewportHalf(len(self.playerList),j)
          scale = 0.0017
          endScroll = -.14
        
          if self.pauseScroll != None:
            self.offset = 0.0

          if self.pauseScroll > 0.5:
            self.pauseScroll = None
          if self.offset == None:
            self.offset = 0
            self.pauseScroll = 0
            self.nextHighScore()

          
          # evilynux - highscore
          if self.song is not None:
            text = _("%s High Scores for %s") % (self.scorePart, self.song.info.name)
          else:
            text = _("%s High Scores") % self.scorePart
          w, h = font.getStringSize(text)

          Theme.setBaseColor(1 - v)
          font.render(text, (.5 - w / 2, .01 - v + self.offset))

          text = _("Difficulty: %s") % (self.scoreDifficulty)
          w, h = font.getStringSize(text)
          Theme.setBaseColor(1 - v)
          font.render(text, (.5 - w / 2, .01 - v + h + self.offset))
        
          x = .01
          y = .16 + v
          
        if self.song:
          i = -1
          for i, scores in enumerate(self.song.info.getHighscores(self.scoreDifficulty, part = self.scorePart)):
            score, stars, name, scores_ext = scores
            notesHit, notesTotal, noteStreak, modVersion, modOptions1, modOptions2 = scores_ext
            if stars == 6:
              stars = 5
              perfect = 1
            else:
              perfect = 0
            for j,player in enumerate(self.playerList):
              if (self.time % 10.0) < 5.0 and i == self.highscoreIndex[j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part:
                Theme.setSelectedColor(1 - v)
                break
              else:
                Theme.setBaseColor(1 - v)
            font.render("%d." % (i + 1), (x, y + self.offset),    scale = scale)
            if notesTotal != 0:
              score = "%s %.1f%%" % (score, (float(notesHit) / notesTotal) * 100.0)
            if noteStreak != 0:
              score = "%s (%d)" % (score, noteStreak)
            font.render(unicode(score), (x + .05, y + self.offset),   scale = scale)
            options = ""
            w2, h2 = font.getStringSize(options, scale = scale / 2)
            font.render(unicode(options), (.6 - w2, y + self.offset),   scale = scale / 2)
            # evilynux - Fixed star size following Font render bugfix
            if perfect == 1 and self.theme == 2:
              glColor3f(1, 1, 0) #racer: perfect is now gold for rock band
            font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale = scale * 1.8)
            if perfect == 1 and self.theme < 2:
              glColor3f(0, 1, 0) #racer: perfect is green for any non-RB theme
            font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale = scale * 1.8)
            for j,player in enumerate(self.playerList):
              if (self.time % 10.0) < 5.0 and i == self.highscoreIndex[j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part:
                Theme.setSelectedColor(1 - v)
                break
              else:
                Theme.setBaseColor(1 - v)
            font.render(name, (x + .8, y + self.offset), scale = scale)
            y += h
            endScroll -= .07
            
          if self.offset < endScroll or i == -1:
            self.offset = .8
            self.nextHighScore()
            endScroll = -0.14
          
        if self.uploadingScores and self.uploadResult is None:
          Theme.setBaseColor(1 - v)
          font.render(_("Uploading Scores..."), (.05, .7 + v), scale = 0.001)
        return



   
      Theme.setBaseColor(1 - v)
      if self.playerList[0].cheating:
        text = _("%s Cheated!") % self.song.info.name
      else:
        text = _("%s Finished!") % self.song.info.name
        w, h = font.getStringSize(text)
        Dialogs.wrapText(font, (.05, .045 - v), text)
        text = "%d/" % self.hits
        text2 = _("%d notes hit") % self.totalnotes
        text = text + text2
        w, h = font.getStringSize(text)
        Dialogs.wrapText(font, (.5 - w / 2, .54 - v - h), text)
        
      for j,player in enumerate(self.playerList):
        if self.playerList[j].cheating:
          self.stars[j] = 0
          self.accuracy[j] = 0.0
    
        self.engine.view.setViewportHalf(len(self.playerList),j)
        text = "%d" % (player.score * self.anim(1000, 2000))
        w, h = bigFont.getStringSize(text)
        bigFont.render(text, (.5 - w / 2, .11 + v + (1.0 - self.anim(0, 1000) ** 3)), scale = 0.0025)
      
        if self.counter > 1000:
          scale = 0.0017
          if self.stars[j] == 6 and self.theme == 2: #racer: gold perfect for RB
            glColor3f(1, 1, 0)  
            text = (Data.STAR2 * (self.stars[j] - 1))
          elif self.stars[j] == 6 and self.theme < 2: #racer: green perfect for non-RB
            glColor3f(0, 1, 0)  
            text = (Data.STAR2 * (self.stars[j] - 1))
          else:
            text = (Data.STAR2 * self.stars[j] + Data.STAR1 * (5 - self.stars[j]))

          w, h = bigFont.getStringSize(Data.STAR1, scale = scale)
          x = .5 - w * len(text) / 2
          for i, ch in enumerate(text):
            bigFont.render(ch, (x + 100 * (1.0 - self.anim(1000 + i * 200, 1000 + (i + 1) * 200)) ** 2, .35 + v), scale = scale)
            x += w
      
        if self.counter > 2500:
          Theme.setBaseColor(1 - v)
          text = _("Accuracy: %.1f%%") % self.accuracy[j]
          w, h = font.getStringSize(text)
          font.render(text, (.5 - w / 2, .55 + v))
          text = _("Longest note streak: %d") % player.longestStreak
          w, h = font.getStringSize(text)
          font.render(text, (.5 - w / 2, .55 + h + v))
          if player.twoChord > 0:
            text = _("Part: %s on %s (2 chord)") % (player.part, player.difficulty)
          else:
            text = _("Part: %s on %s") % (player.part, player.difficulty)
          w, h = font.getStringSize(text)
          font.render(text, (.5 - w / 2, .55 + (2 * h)+ v))
      self.engine.view.setViewport(1,0)
    finally:
      self.engine.view.setViewport(1,0)
      self.engine.view.resetProjection()
示例#27
0
    def render(self, visibility, topMost):
        self.engine.view.setViewport(1, 0)
        SceneClient.render(self, visibility, topMost)

        bigFont = self.engine.data.bigFont
        font = self.engine.data.font

        v = ((1 - visibility)**2)

        glEnable(GL_BLEND)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
        glEnable(GL_COLOR_MATERIAL)

        self.engine.view.setOrthogonalProjection(normalize=True)
        try:
            t = self.time / 100
            w, h, = self.engine.view.geometry[2:4]
            r = .5
            if self.background:
                imgwidth = self.background.width1()
                wfactor = 640.000 / imgwidth
                self.background.transform.reset()
                #self.background.transform.scale(1,-1)
                self.background.transform.scale(wfactor, -wfactor)
                self.background.transform.translate(w / 2, h / 2)
                self.background.draw()

            if self.showHighscores:
                for j, player in enumerate(self.playerList):
                    #self.engine.view.setViewportHalf(len(self.playerList),j)
                    scale = 0.0017
                    endScroll = -.14

                    if self.pauseScroll != None:
                        self.offset = 0.0

                    if self.pauseScroll > 0.5:
                        self.pauseScroll = None
                    if self.offset == None:
                        self.offset = 0
                        self.pauseScroll = 0
                        self.nextHighScore()

                    # evilynux - highscore
                    if self.song is not None:
                        text = _("%s High Scores for %s") % (
                            self.scorePart,
                            Dialogs.removeSongOrderPrefixFromName(
                                self.song.info.name))
                    else:
                        text = _("%s High Scores") % self.scorePart
                    w, h = font.getStringSize(text)

                    Theme.setBaseColor(1 - v)
                    font.render(text, (.5 - w / 2, .01 - v + self.offset))

                    text = _("Difficulty: %s") % (self.scoreDifficulty)
                    w, h = font.getStringSize(text)
                    Theme.setBaseColor(1 - v)
                    font.render(text, (.5 - w / 2, .01 - v + h + self.offset))

                    x = .01
                    y = .16 + v

                if self.song:
                    i = -1
                    for i, scores in enumerate(
                            self.song.info.getHighscores(self.scoreDifficulty,
                                                         part=self.scorePart)):
                        score, stars, name, scores_ext = scores
                        notesHit, notesTotal, noteStreak, modVersion, modOptions1, modOptions2 = scores_ext
                        if stars == 6:
                            stars = 5
                            perfect = 1
                        else:
                            perfect = 0
                        for j, player in enumerate(self.playerList):
                            if (self.time % 10.0
                                ) < 5.0 and i == self.highscoreIndex[
                                    j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part:
                                Theme.setSelectedColor(1 - v)
                                break
                            else:
                                Theme.setBaseColor(1 - v)
                        font.render("%d." % (i + 1), (x, y + self.offset),
                                    scale=scale)
                        if notesTotal != 0:
                            score = "%s %.1f%%" % (
                                score, (float(notesHit) / notesTotal) * 100.0)
                        if noteStreak != 0:
                            score = "%s (%d)" % (score, noteStreak)
                        font.render(unicode(score), (x + .05, y + self.offset),
                                    scale=scale)
                        options = ""
                        w2, h2 = font.getStringSize(options, scale=scale / 2)
                        font.render(unicode(options),
                                    (.6 - w2, y + self.offset),
                                    scale=scale / 2)
                        # evilynux - Fixed star size following Font render bugfix
                        if perfect == 1 and self.theme == 2:
                            glColor3f(
                                1, 1,
                                0)  #racer: perfect is now gold for rock band
                        font.render(unicode(Data.STAR2 * stars + Data.STAR1 *
                                            (5 - stars)),
                                    (x + .6, y + self.offset),
                                    scale=scale * 1.8)
                        if perfect == 1 and self.theme < 2:
                            glColor3f(
                                0, 1, 0
                            )  #racer: perfect is green for any non-RB theme
                        font.render(unicode(Data.STAR2 * stars + Data.STAR1 *
                                            (5 - stars)),
                                    (x + .6, y + self.offset),
                                    scale=scale * 1.8)
                        for j, player in enumerate(self.playerList):
                            if (self.time % 10.0
                                ) < 5.0 and i == self.highscoreIndex[
                                    j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part:
                                Theme.setSelectedColor(1 - v)
                                break
                            else:
                                Theme.setBaseColor(1 - v)
                        font.render(name, (x + .8, y + self.offset),
                                    scale=scale)
                        y += h
                        endScroll -= .07

                    if self.offset < endScroll or i == -1:
                        #self.offset = .8
                        self.offset = self.scoreScrollStartOffset
                        self.nextHighScore()
                        endScroll = -0.14

                for j, player in enumerate(self.playerList):  #MFH
                    if self.uploadingScores[j]:
                        sScale = 0.001
                        sW, sH = font.getStringSize("A", scale=sScale)
                        sYPos = .7 - ((sH * 1.25) * j)
                        Theme.setBaseColor(1 - v)
                        if self.highScoreResult[j] is None:
                            upScoreText = _("Uploading Scores...")
                            font.render("P%d (%s) %s" %
                                        (j + 1, player.name, upScoreText),
                                        (.05, sYPos + v),
                                        scale=sScale)
                        else:
                            result = str(self.highScoreResult[j]).split(";")
                            if len(result) > 0:
                                upScoreText1 = _("Scores uploaded!")
                                if result[0] == "True":
                                    #MFH - display rank if it was successful
                                    if len(result) > 1:
                                        #font.render(_("Scores uploaded! ...your highscore ranks #" + result[1] + " on the world starpower chart!" ), (.05, .7 + v), scale = 0.001)
                                        upScoreText2 = _(
                                            "your highscore ranks")
                                        upScoreText3 = _(
                                            "on the world starpower chart!")
                                        font.render(
                                            "P%d (%s) %s %s  ...%s #%d %s" %
                                            (j + 1, player.name,
                                             player.part.text, upScoreText1,
                                             upScoreText2, int(
                                                 result[1]), upScoreText3),
                                            (.05, sYPos + v),
                                            scale=sScale)
                                    else:
                                        upScoreText2 = _("unknown rank.")
                                        font.render(
                                            "P%d (%s) %s %s  ... %s" %
                                            (j + 1, player.name,
                                             player.part.text, upScoreText1,
                                             upScoreText2), (.05, sYPos + v),
                                            scale=sScale)
                                else:
                                    upScoreText2 = _("no new highscore.")
                                    #font.render(_("Score upload failed!  World charts may be down."), (.05, .7 + v), scale = 0.001)
                                    font.render(
                                        "P%d (%s) %s %s  ...%s" %
                                        (j + 1, player.name, player.part.text,
                                         upScoreText1, upScoreText2),
                                        (.05, sYPos + v),
                                        scale=sScale)
                            else:
                                upScoreText1 = _(
                                    "Score upload failed!  World charts may be down."
                                )
                                font.render("P%d (%s) %s %s" %
                                            (j + 1, player.name,
                                             player.part.text, upScoreText1),
                                            (.05, sYPos + v),
                                            scale=sScale)

                return

            #initial scoring - skipped after names entered
            Theme.setBaseColor(1 - v)
            if self.playerList[0].cheating:
                text = _(
                    "%s Cheated!") % Dialogs.removeSongOrderPrefixFromName(
                        self.song.info.name)
            else:
                text = _(
                    "%s Finished!") % Dialogs.removeSongOrderPrefixFromName(
                        self.song.info.name)
                w, h = font.getStringSize(text)
                Dialogs.wrapText(font, (.05, .045 - v), text)
                text = "%d/" % self.hits
                text2 = _("%d notes hit") % self.totalnotes
                text = text + text2
                w, h = font.getStringSize(text)
                Dialogs.wrapText(font, (.5 - w / 2, .54 - v - h), text)

            #MFH - HOPO system & hit window display
            settingsScale = 0.0012
            #settingsText = "%s settings - HOPOs: %s / %s, Hit Window: %s" % (self.engine.versionString, self.hopoStyle, self.hopoFreq, self.hitWindow)
            settingsText = "%s %s - %s: %s / %s, %s: %s" % (
                self.engine.versionString, self.tsSettings, self.tsHopos,
                self.hopoStyle, self.hopoFreq, self.tsHitWindow,
                self.hitWindow)
            w, h = font.getStringSize(settingsText, settingsScale)
            font.render(settingsText, (.5 - w / 2, 0.0), scale=settingsScale)

            for j, player in enumerate(self.playerList):
                if self.playerList[j].cheating:
                    self.stars[j] = 0
                    self.accuracy[j] = 0.0

                self.engine.view.setViewportHalf(len(self.playerList), j)
                text = "%d" % (player.score * self.anim(1000, 2000))
                w, h = bigFont.getStringSize(text)
                bigFont.render(text, (.5 - w / 2, .11 + v +
                                      (1.0 - self.anim(0, 1000)**3)),
                               scale=0.0025)

                if self.counter > 1000:
                    scale = 0.0017
                    if self.stars[
                            j] == 6 and self.theme == 2:  #racer: gold perfect for RB
                        glColor3f(1, 1, 0)
                        text = (Data.STAR2 * (self.stars[j] - 1))
                    elif self.stars[
                            j] == 6 and self.theme < 2:  #racer: green perfect for non-RB
                        glColor3f(0, 1, 0)
                        text = (Data.STAR2 * (self.stars[j] - 1))
                    else:
                        text = (Data.STAR2 * self.stars[j] + Data.STAR1 *
                                (5 - self.stars[j]))

                    w, h = bigFont.getStringSize(Data.STAR1, scale=scale)
                    x = .5 - w * len(text) / 2
                    for i, ch in enumerate(text):
                        bigFont.render(
                            ch, (x + 100 *
                                 (1.0 - self.anim(1000 + i * 200, 1000 +
                                                  (i + 1) * 200))**2, .35 + v),
                            scale=scale)
                        x += w

                if self.counter > 2500:
                    Theme.setBaseColor(1 - v)
                    text = _("Accuracy: %.1f%%") % self.accuracy[j]
                    w, h = font.getStringSize(text)
                    font.render(text, (.5 - w / 2, .55 + v))
                    text = _("Longest note streak: %d") % player.longestStreak
                    w, h = font.getStringSize(text)
                    font.render(text, (.5 - w / 2, .55 + h + v))
                    if player.twoChord > 0:
                        text = _("Part: %s on %s (2 chord)") % (
                            player.part, player.difficulty)
                    else:
                        text = _("Part: %s on %s") % (player.part,
                                                      player.difficulty)
                    w, h = font.getStringSize(text)
                    font.render(text, (.5 - w / 2, .55 + (2 * h) + v))
            self.engine.view.setViewport(1, 0)
        finally:
            self.engine.view.setViewport(1, 0)
            self.engine.view.resetProjection()