From b11d796b525a70f1458ce2d7188baac4b6d5aa27 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sun, 20 Feb 2005 15:22:22 +0000 Subject: [PATCH] Find out which player is playing next (and which song), but don't print it yet. --- bigscreen/fetch_group.cpp | 3 +- bigscreen/group.h | 2 +- bigscreen/groupscreen.cpp | 65 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/bigscreen/fetch_group.cpp b/bigscreen/fetch_group.cpp index 75e458a..62fbd50 100644 --- a/bigscreen/fetch_group.cpp +++ b/bigscreen/fetch_group.cpp @@ -6,7 +6,7 @@ FetchGroup::FetchGroup(unsigned tournament, unsigned round, unsigned parallel, G void FetchGroup::operator() (pqxx::transaction<> &t) { // note: this _will_ break if any song has more than one short title! - pqxx::result res( t.exec("SELECT round,parallel,position,playmode,difficulty,songnumber,player,nick,song,title,COALESCE(shorttitle,title) AS shorttitle,artist,chosen,score FROM roundparticipation NATURAL JOIN players NATURAL JOIN scores NATURAL LEFT JOIN songs NATURAL LEFT JOIN songshorttitles WHERE " + pqxx::result res( t.exec("SELECT round,parallel,position,playmode,difficulty,position,songnumber,player,nick,song,title,COALESCE(shorttitle,title) AS shorttitle,artist,chosen,score FROM roundparticipation NATURAL JOIN players NATURAL JOIN scores NATURAL LEFT JOIN songs NATURAL LEFT JOIN songshorttitles WHERE " "tournament=" + pqxx::to_string(tournament) + " AND " + "round=" + pqxx::to_string(round) + " AND " + "parallel=" + pqxx::to_string(parallel) + " " + @@ -23,6 +23,7 @@ void FetchGroup::operator() (pqxx::transaction<> &t) Player p; p.id = i["player"].as(p.id); + p.position = i["position"].as(p.id); p.nick = i["nick"].as(p.nick); p.total = 0; p.rank = 1; diff --git a/bigscreen/group.h b/bigscreen/group.h index 3aa0efc..35c89c4 100644 --- a/bigscreen/group.h +++ b/bigscreen/group.h @@ -15,7 +15,7 @@ struct Score { int score; }; struct Player { - unsigned id; + unsigned id, position; widestring nick; unsigned total, rank; diff --git a/bigscreen/groupscreen.cpp b/bigscreen/groupscreen.cpp index aca0780..3628447 100644 --- a/bigscreen/groupscreen.cpp +++ b/bigscreen/groupscreen.cpp @@ -223,6 +223,71 @@ void GroupScreen::draw(unsigned char *buf) y += 40; } + /* + * Next up (at the bottom) is "who's playing, what will he/she be playing, and + * optionally, how much to lead/win and how much to secure qualification" (the + * last one only in the final round). We assume playing is done in a modified + * zigzag; all the random songs are played first in zigzag/wrapping order (player + * 1 song 1, player 2 song 2, player 3 song 3, player 1 song 2, player 2 song 3, + * player 3 song 1, etc... assuming three songs and three players) and then all + * the chosen songs are played (we assume only one chosen song). + * + * The lines are as follows: + * + * + * + * High score: by at + * Needs to (lead/win): + * Needs to secure qualification: + */ + + /* Find the first player with the fewest songs played. */ + unsigned min_played_songs = 9999, num_random_songs = 0; + Player *next_player = NULL; + for (std::vector::iterator i = group.players.begin(); i != group.players.end(); ++i) { + unsigned this_played = 0, this_random_songs = 0; + for (std::vector::const_iterator j = i->scores.begin(); j != i->scores.end(); ++j, ++col) { + if (j->score != -1) + ++this_played; + if (!j->chosen) + ++this_random_songs; + } + + if (this_played < min_played_songs) { + min_played_songs = this_played; + next_player = &(*i); + num_random_songs = this_random_songs; // should be equal for all + } + } + + /* Find out what song this player is supposed to play next; try random songs first */ + Score *next_song = NULL; + + for (unsigned i = 0; i < num_random_songs; ++i) { + unsigned j = (i + next_player->position - 1) % num_random_songs; + if (next_player->scores[j].score == -1) { + next_song = &(next_player->scores[j]); + printf("Selecting score %u\n", j); + break; + } + } + + // then all songs, if that didn't work out (slightly icky, but hey) + if (next_song == NULL) { + for (unsigned i = 0; i < num_scores; ++i) { + unsigned j = (i + next_player->position) % num_scores; + if (next_player->scores[j].score == -1) { + next_song = &(next_player->scores[j]); + printf("Selecting score %u\n", j); + break; + } + } + } + + if (next_song != NULL) { + printf("Next: player %u\n", next_player->id); + } + valid = true; draw_all_deferred_text(buf, td, last_text); last_text = td; -- 2.39.2