예제 #1
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()
예제 #2
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()
예제 #3
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()
예제 #4
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()
예제 #5
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()
예제 #6
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()
  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()
예제 #8
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()