Find out which player is playing next (and which song), but don't print it yet.
authorSteinar H. Gunderson <sesse@samfundet.no>
Sun, 20 Feb 2005 15:22:22 +0000 (15:22 +0000)
committerSteinar H. Gunderson <sesse@samfundet.no>
Sun, 20 Feb 2005 15:22:22 +0000 (15:22 +0000)
bigscreen/fetch_group.cpp
bigscreen/group.h
bigscreen/groupscreen.cpp

index 75e458a..62fbd50 100644 (file)
@@ -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;
index 3aa0efc..35c89c4 100644 (file)
@@ -15,7 +15,7 @@ struct Score {
        int score;
 };
 struct Player {
-       unsigned id;
+       unsigned id, position;
        widestring nick;
        unsigned total, rank;
        
index aca0780..3628447 100644 (file)
@@ -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:
+        *
+        * <player>
+        * <song>
+        * High score: <hs> by <hsplayer> at <hsevent>
+        * Needs to (lead/win): <leadscore>
+        * Needs to secure qualification: <qualscore>
+        */
+       
+       /* 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<Player>::iterator i = group.players.begin(); i != group.players.end(); ++i) {
+               unsigned this_played = 0, this_random_songs = 0;
+               for (std::vector<Score>::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;