|
From: Tapio V. <aa...@us...> - 2009-10-23 19:18:59
|
Module: performous
Branch: master
Commit: 5aaf2b1b15010389aacb274599a19a6ac9298040
Author: Tapio Vierros <tap...@gm...>
Date: Fri Oct 23 22:14:36 2009 +0300
Singers now get a textual feedback after each lyrics row.
---
game/layout_singer.cc | 24 ++++++++++++++++++++++++
game/layout_singer.hh | 1 +
game/player.cc | 16 +++++++++++++++-
game/player.hh | 6 ++++++
4 files changed, 46 insertions(+), 1 deletions(-)
diff --git a/game/layout_singer.cc b/game/layout_singer.cc
index c4b31a0..e99c79b 100644
--- a/game/layout_singer.cc
+++ b/game/layout_singer.cc
@@ -14,6 +14,10 @@ LayoutSinger::LayoutSinger(Song &_song, Players& _players, boost::shared_ptr<The
m_score_text[1].reset(new SvgTxtThemeSimple(getThemePath("sing_score_text.svg"), config["graphic/text_lod"].f()));
m_score_text[2].reset(new SvgTxtThemeSimple(getThemePath("sing_score_text.svg"), config["graphic/text_lod"].f()));
m_score_text[3].reset(new SvgTxtThemeSimple(getThemePath("sing_score_text.svg"), config["graphic/text_lod"].f()));
+ m_line_rank_text[0].reset(new SvgTxtThemeSimple(getThemePath("sing_score_text.svg"), config["graphic/text_lod"].f()));
+ m_line_rank_text[1].reset(new SvgTxtThemeSimple(getThemePath("sing_score_text.svg"), config["graphic/text_lod"].f()));
+ m_line_rank_text[2].reset(new SvgTxtThemeSimple(getThemePath("sing_score_text.svg"), config["graphic/text_lod"].f()));
+ m_line_rank_text[3].reset(new SvgTxtThemeSimple(getThemePath("sing_score_text.svg"), config["graphic/text_lod"].f()));
m_player_icon.reset(new Surface(getThemePath("sing_pbox.svg")));
}
@@ -49,6 +53,26 @@ void LayoutSinger::drawScore(Position position) {
break;
}
m_score_text[i%4]->draw();
+ // Give some feedback on how well the last lyricss row went
+ if (p->m_maxLineScore > 0) {
+ std::string prevLineRank;
+ if (p->m_prevLineScore > 0.9) { prevLineRank = "Perfect"; glColor4f(0.5, 1.0, 0.0, act); }
+ else if (p->m_prevLineScore > 0.8) { prevLineRank = "Excellent"; glColor4f(0.2, 0.8, 0.2, act); }
+ else if (p->m_prevLineScore > 0.6) { prevLineRank = "Good"; glColor4f(0.6, 1.0, 0.2, act); }
+ else if (p->m_prevLineScore > 0.5) { prevLineRank = "Ok"; glColor4f(0.6, 1.0, 0.2, act); }
+ else if (p->m_prevLineScore > 0.3) { prevLineRank = "Poor"; glColor4f(0.6, 0.8, 0.2, act); }
+ else { prevLineRank = "Horrible"; glColor4f(0.5, 0.5, 0.3, act); }
+ m_line_rank_text[i%4]->render(prevLineRank);
+ switch(position) {
+ case LayoutSinger::BOTTOM:
+ m_line_rank_text[i%4]->dimensions().middle(-0.350 + 0.01 + 0.25 * i).fixedHeight(0.055).screenTop(0.11);
+ break;
+ case LayoutSinger::MIDDLE:
+ m_line_rank_text[i%4]->dimensions().right(0.45).fixedHeight(0.04).screenTop(0.060 + 0.050 * i);
+ break;
+ }
+ m_line_rank_text[i%4]->draw();
+ }
glColor4f(1.0, 1.0, 1.0, 1.0);
}
}
diff --git a/game/layout_singer.hh b/game/layout_singer.hh
index e91aba2..85823a1 100644
--- a/game/layout_singer.hh
+++ b/game/layout_singer.hh
@@ -61,6 +61,7 @@ class LayoutSinger {
std::deque<LyricRow> m_lyrics;
boost::scoped_ptr<Surface> m_player_icon;
boost::scoped_ptr<SvgTxtThemeSimple> m_score_text[4];
+ boost::scoped_ptr<SvgTxtThemeSimple> m_line_rank_text[4];
Players& m_players;
boost::shared_ptr<ThemeSing> m_theme;
};
diff --git a/game/player.cc b/game/player.cc
index 697ad5e..02df7d9 100644
--- a/game/player.cc
+++ b/game/player.cc
@@ -11,7 +11,21 @@ void Player::update() {
m_pitch[m_pos++] = std::make_pair(t->freq, t->stabledb);
double endTime = Engine::TIMESTEP * m_pos;
while (m_scoreIt != m_song.notes.end()) {
- m_score += m_song.m_scoreFactor * m_scoreIt->score(m_song.scale.getNote(t->freq), beginTime, endTime);
+ double score_addition = m_song.m_scoreFactor * m_scoreIt->score(m_song.scale.getNote(t->freq), beginTime, endTime);
+ m_score += score_addition;
+ m_lineScore += score_addition;
+ // If a row of lyrics ends, calculate how well it went
+ if (m_scoreIt->type == Note::SLEEP && m_lineScore > 0) {
+ m_prevLineScore = m_lineScore;
+ if (m_maxLineScore > 0) m_prevLineScore /= m_maxLineScore;
+ m_lineScore = 0;
+ m_maxLineScore = 0;
+ Notes::const_iterator maxScoreIt = m_scoreIt + 1;
+ while (maxScoreIt != m_song.notes.end() && maxScoreIt->type != Note::SLEEP) {
+ m_maxLineScore += m_song.m_scoreFactor * maxScoreIt->maxScore();
+ maxScoreIt++;
+ }
+ }
if (endTime < m_scoreIt->end) break;
++m_scoreIt;
}
diff --git a/game/player.hh b/game/player.hh
index 885b7b7..48c2588 100644
--- a/game/player.hh
+++ b/game/player.hh
@@ -22,6 +22,12 @@ struct Player {
size_t m_pos;
/// score for current song
double m_score;
+ /// score for current line
+ double m_lineScore;
+ /// maximum score for the current line
+ double m_maxLineScore;
+ /// score for the previous line (normalized)
+ double m_prevLineScore;
/// activity timer
unsigned m_activitytimer;
/// score iterator
|