|
From: Markus R. <god...@us...> - 2009-07-29 15:35:40
|
Module: performous
Branch: master
Commit: ce821cfd8c2977fa3dd569094fdc2627eb2bc628
Author: Markus Raab <un...@ma...>
Date: Sat Jul 25 11:41:13 2009 +0200
entry in highscore works
verbose output for debugging
---
game/players.hh | 2 +
game/screen_players.cc | 65 ++++++++++++++++++++++++++++++++++++------------
game/screen_players.hh | 10 ++++++-
game/screen_sing.cc | 36 ++++++++++----------------
game/screen_sing.hh | 3 +-
5 files changed, 75 insertions(+), 41 deletions(-)
diff --git a/game/players.hh b/game/players.hh
index 10f24f9..5937926 100644
--- a/game/players.hh
+++ b/game/players.hh
@@ -35,6 +35,7 @@ class Players: boost::noncopyable {
private:
typedef std::vector<PlayerItem> players_t;
typedef std::list<Player> cur_players_t;
+ typedef std::list<int> cur_scores_t;
private:
players_t m_players;
@@ -48,6 +49,7 @@ class Players: boost::noncopyable {
public:
cur_players_t cur;
+ cur_scores_t scores;
public:
Players(std::string filename);
diff --git a/game/screen_players.cc b/game/screen_players.cc
index ceaa6ae..8623b81 100644
--- a/game/screen_players.cc
+++ b/game/screen_players.cc
@@ -14,6 +14,13 @@ ScreenPlayers::ScreenPlayers(std::string const& name, Audio& audio, Players& pla
}
void ScreenPlayers::enter() {
+ m_highscore.reset(new HighScore(m_song->path, "High.sco"));
+ try {
+ m_highscore->load();
+ } catch (HighScoreException const& hi) {
+ std::cerr << "high.sco:" << hi.line() << " " << hi.what() << std::endl;
+ }
+
theme.reset(new ThemeSongs());
m_emptyCover.reset(new Surface(getThemePath("no_cover.svg"))); // TODO use persons head
m_search.text.clear();
@@ -29,20 +36,27 @@ void ScreenPlayers::exit() {
m_songbg.reset();
m_playing.clear();
m_playReq.clear();
+
+ try {
+ m_highscore->save();
+ } catch (HighScoreException const& hi) {
+ std::cerr << "high.sco:" << hi.line() << " " << hi.what() << std::endl;
+ }
+ m_highscore.reset();
}
void ScreenPlayers::manageEvent(SDL_Event event) {
- ScreenManager* sm = ScreenManager::getSingletonPtr();
- if (event.type != SDL_KEYDOWN) return;
- SDL_keysym keysym = event.key.keysym;
- int key = keysym.sym;
- SDLMod mod = event.key.keysym.mod;
+ScreenManager* sm = ScreenManager::getSingletonPtr();
+if (event.type != SDL_KEYDOWN) return;
+SDL_keysym keysym = event.key.keysym;
+int key = keysym.sym;
+SDLMod mod = event.key.keysym.mod;
- if (key == SDLK_r && mod & KMOD_CTRL) { m_players.reload(); m_players.setFilter(m_search.text); }
- if (m_search.process(keysym)) m_players.setFilter(m_search.text);
- else if (key == SDLK_ESCAPE) {
- if (m_search.text.empty()) sm->activateScreen("Songs");
- else { m_search.text.clear(); m_players.setFilter(m_search.text); }
+if (key == SDLK_r && mod & KMOD_CTRL) { m_players.reload(); m_players.setFilter(m_search.text); }
+if (m_search.process(keysym)) m_players.setFilter(m_search.text);
+else if (key == SDLK_ESCAPE) {
+ if (m_search.text.empty()) sm->activateScreen("Songs");
+ else { m_search.text.clear(); m_players.setFilter(m_search.text); }
}
// The rest are only available when there are songs available
else if (m_players.empty()) return;
@@ -52,10 +66,27 @@ void ScreenPlayers::manageEvent(SDL_Event event) {
if (m_players.empty())
{
m_players.addPlayer(m_search.text);
- m_players.setFilter(m_search.text); // set new Player as current
+ m_players.setFilter(m_search.text);
+ // the current player is the new created one
+ }
+ std::cout << "add new highscore " << m_players.scores.front()
+ << " name: " << m_players.current().name
+ << std::endl;
+ m_highscore->addNewHighscore(m_players.current().name, m_players.scores.front());
+ m_players.scores.pop_front();
+
+ if (m_players.scores.empty() || !m_highscore->reachedNewHighscore(m_players.scores.front()))
+ {
+ // no more highscore, we are now finished
+ // clear the old players lists
+ m_players.scores.clear();
+ m_players.cur.clear();
+ sm->activateScreen("Songs");
+ } else {
+ std::cout << "enter the next highscore" << std::endl;
+ m_search.text.clear();
+ // enter the next highscore
}
- // we are now finished
- sm->activateScreen("Songs");
}
else if (key == SDLK_LEFT) m_players.advance(-1);
else if (key == SDLK_RIGHT) m_players.advance(1);
@@ -85,10 +116,12 @@ void ScreenPlayers::draw() {
oss_order << m_search.text << '\n';
}
} else {
- PlayerItem player = m_players.current();
// Format the player information text
- oss_song << player.name << '\n';
- oss_order << (m_search.text.empty() ? std::string("new player") : m_search.text) << '\n';
+ oss_song << "You reached " << m_players.scores.front() << " points\n";
+ oss_order << "Name: " << m_players.current().name
+ << " Search Text: "
+ << (m_search.text.empty() ? std::string("new player") : m_search.text)
+ << '\n';
oss_order << "(" << m_players.currentId() + 1 << "/" << m_players.size() << ")";
double spos = m_players.currentPosition(); // This needs to be polled to run the animation
diff --git a/game/screen_players.hh b/game/screen_players.hh
index c8294d9..86e68b5 100644
--- a/game/screen_players.hh
+++ b/game/screen_players.hh
@@ -6,10 +6,11 @@
#include "opengl_text.hh"
#include "screen.hh"
#include "surface.hh"
-#include "players.hh"
#include "textinput.hh"
#include "theme.hh"
#include "video.hh"
+#include "players.hh"
+#include "highscore.hh"
class CAudio;
@@ -23,9 +24,16 @@ class ScreenPlayers : public Screen {
void manageEvent(SDL_Event event);
void draw();
+ void setSong (boost::shared_ptr<Song> song_)
+ {
+ m_song = song_;
+ }
+
private:
Audio& m_audio;
Players& m_players;
+ boost::shared_ptr<Song> m_song; /// Pointer to the current song
+ boost::scoped_ptr<HighScore> m_highscore;
boost::scoped_ptr<Surface> m_songbg;
boost::scoped_ptr<Video> m_video;
boost::scoped_ptr<ThemeSongs> theme;
diff --git a/game/screen_sing.cc b/game/screen_sing.cc
index 71eac09..795b5b6 100644
--- a/game/screen_sing.cc
+++ b/game/screen_sing.cc
@@ -3,7 +3,6 @@
#include "util.hh"
#include "configuration.hh"
#include "xtime.hh"
-#include "highscore.hh"
#include <boost/format.hpp>
#include <boost/lexical_cast.hpp>
#include "songs.hh"
@@ -71,11 +70,14 @@ void ScreenSing::manageEvent(SDL_Event event) {
else if (key == SDLK_RETURN) {
if (m_score_window.get())
{
- // Score window visible -> Enter quits to Songs or Players Screen
- // TODO if (m_players.hasNewHighscore()) sm->activateScreen("Players");
- sm->activateScreen("Songs");
+ // Score window visible -> Enter quits to Players Screen
+ Screen* s = sm->getScreen("Players");
+ ScreenPlayers* ss = dynamic_cast<ScreenPlayers*> (s);
+ assert(ss);
+ ss->setSong(m_song);
+ sm->activateScreen("Players");
}
- else if (status == Song::FINISHED) m_score_window.reset(new ScoreWindow(*m_engine, *m_song, m_players)); // Song finished, but no score window -> show it
+ else if (status == Song::FINISHED) m_score_window.reset(new ScoreWindow(*m_engine, m_players)); // 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;
@@ -184,7 +186,7 @@ void ScreenSing::draw() {
}
else if (!m_audio.isPlaying() || (status == Song::FINISHED && m_audio.getLength() - time < 3.0)) {
m_quitTimer.setValue(QUIT_TIMEOUT);
- m_score_window.reset(new ScoreWindow(*m_engine, *m_song, m_players));
+ m_score_window.reset(new ScoreWindow(*m_engine, m_players));
}
}
@@ -212,8 +214,7 @@ void ScreenSing::drawScores() {
}
}
-ScoreWindow::ScoreWindow(Engine& e, Song const& song, Players & players):
- m_song(song),
+ScoreWindow::ScoreWindow(Engine& e, Players & players):
m_players(players),
m_pos(0.8, 2.0),
m_bg(getThemePath("score_window.svg")),
@@ -224,27 +225,18 @@ ScoreWindow::ScoreWindow(Engine& e, Song const& song, Players & players):
m_pos.setTarget(0.0);
e.kill(); // kill the engine thread (to avoid consuming memory)
-
- HighScore hi (m_song.path, "High.sco");
- // TODO fallback path if not writeable?
-
- try {
- hi.load();
- } catch (HighScoreException const& hi) {
- std::cerr << "high.sco:" << hi.line() << " " << hi.what() << std::endl;
- }
+ m_players.scores.clear();
unsigned int topScore = 0;
for (std::list<Player>::iterator p = m_players.cur.begin(); p != m_players.cur.end();) {
unsigned int score = p->getScore();
if (score < 500) { p = m_players.cur.erase(p); continue; }
+ m_players.scores.push_back(score);
if (score > topScore) topScore = score;
++p;
}
- try {
- hi.save();
- } catch (HighScoreException const& hi) {
- std::cerr << "high.sco:" << hi.line() << " " << hi.what() << std::endl;
- }
+ m_players.scores.sort();
+ // topScore is also in m_players.scores.front()
+
if (m_players.cur.empty()) m_rank = "No singer!";
else if (topScore > 8000) m_rank = "Hit singer";
else if (topScore > 6000) m_rank = "Lead singer";
diff --git a/game/screen_sing.hh b/game/screen_sing.hh
index c89ba9d..a096e63 100644
--- a/game/screen_sing.hh
+++ b/game/screen_sing.hh
@@ -21,12 +21,11 @@
class ScoreWindow {
public:
/// constructor
- ScoreWindow(Engine & e, Song const& song, Players & players);
+ ScoreWindow(Engine & e, Players & players);
/// draws ScoreWindow
void draw();
private:
- Song const& m_song;
Players & m_players;
AnimValue m_pos;
Surface m_bg;
|