|
From: Markus R. <god...@us...> - 2009-11-13 14:47:22
|
Module: performous
Branch: master
Commit: 945dbb55def4101b95d3ea3c8acd50a10af0e9ed
Author: Markus Raab <un...@ma...>
Date: Fri Nov 13 15:37:34 2009 +0100
hiscore for instruments
added some info output
getTrack in GuitarGraph added
kill the engine outside of score window
---
game/database.cc | 10 ++++++----
game/database.hh | 11 ++++++++++-
game/guitargraph.cc | 1 +
game/guitargraph.hh | 2 ++
game/screen_players.cc | 2 +-
game/screen_sing.cc | 41 +++++++++++++++++++++++++++++++----------
game/screen_sing.hh | 5 +++--
7 files changed, 54 insertions(+), 18 deletions(-)
diff --git a/game/database.cc b/game/database.cc
index aa6c871..c53a57d 100644
--- a/game/database.cc
+++ b/game/database.cc
@@ -71,17 +71,19 @@ void Database::addSong (boost::shared_ptr<Song> s) {
void Database::addHiscore (boost::shared_ptr<Song> s) {
int playerid = m_players.lookup(m_players.current().name);
- int score = scores.front();
+ int score = scores.front().score;
+ std::string track = scores.front().track;
int songid = m_songs.lookup(s);
- m_hiscores.addHiscore(score, playerid, songid);
+ m_hiscores.addHiscore(score, playerid, songid, track);
}
bool Database::reachedHiscore (boost::shared_ptr<Song> s) const {
- int score = scores.front();
+ int score = scores.front().score;
+ std::string track = scores.front().track;
int songid = m_songs.lookup(s);
- return m_hiscores.reachedHiscore(score, songid);
+ return m_hiscores.reachedHiscore(score, songid, track);
}
void Database::queryOverallHiscore (std::ostream & os, std::string const& track) const {
diff --git a/game/database.hh b/game/database.hh
index 00af889..c1be3de 100644
--- a/game/database.hh
+++ b/game/database.hh
@@ -9,6 +9,15 @@
#include "fs.hh"
+struct ScoreItem {
+ int score;
+ std::string track;
+ bool operator < (ScoreItem const& other)
+ {
+ return score < other.score;
+ }
+};
+
/**Access to a database for performous which holds
Player-, Hiscore-, Song-, Track- and (in future)
Partydata.
@@ -64,7 +73,7 @@ class Database
friend class Engine;
private: // will be bypassed by above friend declaration
typedef std::list<Player> cur_players_t;
- typedef std::list<int> cur_scores_t;
+ typedef std::list<ScoreItem> cur_scores_t;
//This fields are misused as additional parameters
cur_players_t cur;
diff --git a/game/guitargraph.cc b/game/guitargraph.cc
index e437130..88d2bfd 100644
--- a/game/guitargraph.cc
+++ b/game/guitargraph.cc
@@ -46,6 +46,7 @@ namespace {
}
GuitarGraph::GuitarGraph(Audio& audio, Song const& song, std::string track):
+ m_track(track),
m_audio(audio),
m_input(track=="drums" ? input::DRUMS : input::GUITAR),
m_song(song),
diff --git a/game/guitargraph.hh b/game/guitargraph.hh
index 44d12fd..bcf9aa6 100644
--- a/game/guitargraph.hh
+++ b/game/guitargraph.hh
@@ -59,9 +59,11 @@ class GuitarGraph {
double correctness() const { return m_correctness.get(); }
std::string getTrackIndex() const { return m_track_index->first; }
int getScore() const { return m_score * m_scoreFactor; }
+ std::string getTrack() const { return m_track; }
private:
void fail(double time, int fret);
void endHold(int fret);
+ std::string m_track;
Audio& m_audio;
input::InputDev m_input;
Song const& m_song;
diff --git a/game/screen_players.cc b/game/screen_players.cc
index 48115aa..afb6e3b 100644
--- a/game/screen_players.cc
+++ b/game/screen_players.cc
@@ -115,7 +115,7 @@ void ScreenPlayers::draw() {
}
} else {
// Format the player information text
- oss_song << "You reached " << m_database.scores.front() << " points!\n";
+ oss_song << "You reached " << m_database.scores.front().score << " points!\n";
oss_order << "Please enter your Name!\n"
<< "Name: " << m_players.current().name << '\n'
<< "Search Text: "
diff --git a/game/screen_sing.cc b/game/screen_sing.cc
index 5f51a8f..9736314 100644
--- a/game/screen_sing.cc
+++ b/game/screen_sing.cc
@@ -92,7 +92,10 @@ void ScreenSing::enter() {
void ScreenSing::instrumentLayout(double time) {
for (Instruments::iterator it = m_instruments.begin(); it != m_instruments.end();) {
- if (it->dead(time)) it = m_instruments.erase(it); else ++it;
+ if (it->dead(time)) {
+ std::cout << it->getTrack() << " was thrown out after " << time << " inactive" << std::endl;
+ it = m_instruments.erase(it);
+ } else ++it;
}
double iw = std::min(0.5, 1.0 / m_instruments.size());
for (Instruments::size_type i = 0, s = m_instruments.size(); i < s; ++i) {
@@ -173,7 +176,10 @@ void ScreenSing::manageEvent(SDL_Event event) {
}
else if (key == SDLK_RETURN) {
if (m_score_window.get()) { activateNextScreen(); return; } // Score window visible -> Enter quits
- else if (status == Song::FINISHED) m_score_window.reset(new ScoreWindow(*m_engine, m_database)); // Song finished, but no score window -> show it
+ else if (status == Song::FINISHED) {
+ m_engine->kill(); // kill the engine thread (to avoid consuming memory)
+ m_score_window.reset(new ScoreWindow(m_instruments, m_database)); // Song finished, but no score window -> show it
+ }
}
else if (key == SDLK_SPACE || key == SDLK_PAUSE) m_audio.togglePause();
if (m_score_window.get()) return;
@@ -295,7 +301,8 @@ void ScreenSing::draw() {
else if (!m_audio.isPlaying() || (status == Song::FINISHED && m_audio.getLength() - time < 3.0)) {
// Time to create the score window
m_quitTimer.setValue(QUIT_TIMEOUT);
- m_score_window.reset(new ScoreWindow(*m_engine, m_database));
+ m_engine->kill(); // kill the engine thread (to avoid consuming memory)
+ m_score_window.reset(new ScoreWindow(m_instruments, m_database));
}
}
@@ -305,7 +312,7 @@ void ScreenSing::draw() {
}
}
-ScoreWindow::ScoreWindow(Engine& e, Database& database):
+ScoreWindow::ScoreWindow(Instruments& instruments, Database& database):
m_database(database),
m_pos(0.8, 2.0),
m_bg(getThemePath("score_window.svg")),
@@ -314,17 +321,31 @@ ScoreWindow::ScoreWindow(Engine& e, Database& database):
m_score_rank(getThemePath("score_rank.svg"))
{
m_pos.setTarget(0.0);
- e.kill(); // kill the engine thread (to avoid consuming memory)
m_database.scores.clear();
- unsigned int topScore = 0;
+ int topScore = 0;
for (std::list<Player>::iterator p = m_database.cur.begin(); p != m_database.cur.end();) {
- unsigned int score = p->getScore();
- if (score < 500) { p = m_database.cur.erase(p); continue; }
- m_database.scores.push_back(score);
- if (score > topScore) topScore = score;
+ ScoreItem item;
+ item.score = p->getScore();
+ item.track = "vocals";
+
+ if (item.score < 500) { p = m_database.cur.erase(p); continue; }
+ m_database.scores.push_back(item);
+ if (item.score > topScore) topScore = item.score;
++p;
}
+ for (Instruments::iterator it = instruments.begin(); it != instruments.end();) {
+ ScoreItem item;
+ item.score = it->getScore();
+ item.track = it->getTrack();
+
+ if (item.score < 500) { std::cout << "kick " << item.track << std::endl; it = instruments.erase(it); continue; }
+ std::cout << "insert " << item.track << " score: " << item.score << std::endl;
+ m_database.scores.push_back(item);
+ // TODO: top score for best instrumental
+ // if (item.score > topScore) topScore = item.score;
+ ++it;
+ }
m_database.scores.sort();
m_database.scores.reverse(); // top should be first
// topScore is also in m_database.scores.front()
diff --git a/game/screen_sing.hh b/game/screen_sing.hh
index 10a8095..8663473 100644
--- a/game/screen_sing.hh
+++ b/game/screen_sing.hh
@@ -22,11 +22,13 @@ class Capture;
class Database;
class Video;
+typedef boost::ptr_vector<GuitarGraph> Instruments;
+
/// shows score at end of song
class ScoreWindow {
public:
/// constructor
- ScoreWindow(Engine & e, Database& database);
+ ScoreWindow(Instruments& instruments, Database& database);
/// draws ScoreWindow
void draw();
bool empty() { return m_database.cur.empty(); }
@@ -79,7 +81,6 @@ class ScreenSing: public Screen {
boost::scoped_ptr<Surface> m_help;
boost::scoped_ptr<Engine> m_engine;
boost::scoped_ptr<LayoutSinger> m_layout_singer;
- typedef boost::ptr_vector<GuitarGraph> Instruments;
Instruments m_instruments;
double m_latencyAV; // Latency between audio and video output (do not confuse with latencyAR)
boost::shared_ptr<ThemeSing> theme;
|