From 876c65c3f4f828a54fa8041f5d68e3c4cae1d463 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 28 Feb 2005 19:12:35 +0000 Subject: [PATCH] Make the bigscreen application support running groups on multiple machines. --- bigscreen/ccbs_bigscreen.cpp | 12 ++++++----- bigscreen/fetch_list_of_active_groups.cpp | 1 + bigscreen/fetch_list_of_active_groups.h | 2 +- bigscreen/groupscreen.cpp | 26 ++++++++++++++++------- bigscreen/groupscreen.h | 4 ++-- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/bigscreen/ccbs_bigscreen.cpp b/bigscreen/ccbs_bigscreen.cpp index 527e9c5..fb53775 100644 --- a/bigscreen/ccbs_bigscreen.cpp +++ b/bigscreen/ccbs_bigscreen.cpp @@ -39,13 +39,15 @@ void init(pqxx::connection &conn) std::fprintf(stderr, "Current tournament is %d\n", active_tournament.id); for (std::vector::const_iterator i = active_groups.begin(); i != active_groups.end(); ++i) { - std::fprintf(stderr, "tourn: %u round: %u parallel: %u\n", - i->tournament, i->round, i->parallel); + std::fprintf(stderr, "tourn: %u round: %u parallel: %u num_machines: %u\n", + i->tournament, i->round, i->parallel, i->num_machines); // memory leaks here? - RotateScreen *rs = new RotateScreen(); - screens.push_back(rs); - rs->add_screen(new GroupScreen(conn, i->tournament, i->round, i->parallel)); + for (unsigned j = 0; j < i->num_machines; ++j) { + RotateScreen *rs = new RotateScreen(); + screens.push_back(rs); + rs->add_screen(new GroupScreen(conn, i->tournament, i->round, i->parallel, j, i->num_machines)); + } } } diff --git a/bigscreen/fetch_list_of_active_groups.cpp b/bigscreen/fetch_list_of_active_groups.cpp index c2d587b..ce748aa 100644 --- a/bigscreen/fetch_list_of_active_groups.cpp +++ b/bigscreen/fetch_list_of_active_groups.cpp @@ -13,6 +13,7 @@ void FetchListOfActiveGroups::operator() (pqxx::transaction<> &t) g.tournament = i["tournament"].as(g.tournament); g.round = i["round"].as(g.round); g.parallel = i["parallel"].as(g.parallel); + g.num_machines = i["num_machines"].as(g.num_machines); active->push_back(g); } diff --git a/bigscreen/fetch_list_of_active_groups.h b/bigscreen/fetch_list_of_active_groups.h index b1039d3..fbac624 100644 --- a/bigscreen/fetch_list_of_active_groups.h +++ b/bigscreen/fetch_list_of_active_groups.h @@ -5,7 +5,7 @@ #include struct SkeletonGroup { - unsigned tournament, round, parallel; + unsigned tournament, round, parallel, num_machines; }; /* A transactor that fetches the current list of active groups. */ diff --git a/bigscreen/groupscreen.cpp b/bigscreen/groupscreen.cpp index d0370de..e811369 100644 --- a/bigscreen/groupscreen.cpp +++ b/bigscreen/groupscreen.cpp @@ -10,8 +10,8 @@ #include "fetch_highscore.h" #include "fonts.h" -GroupScreen::GroupScreen(pqxx::connection &conn, unsigned tournament, unsigned round, unsigned parallel) - : tournament(tournament), round(round), parallel(parallel), scores_changed(conn, "scores"), conn(conn), valid(false) +GroupScreen::GroupScreen(pqxx::connection &conn, unsigned tournament, unsigned round, unsigned parallel, unsigned machine, unsigned num_machines) + : tournament(tournament), round(round), parallel(parallel), machine(machine), num_machines(num_machines), scores_changed(conn, "scores"), conn(conn), valid(false) { } @@ -144,11 +144,15 @@ void GroupScreen::draw(unsigned char *buf) my_draw_text_deferred(td, "Rank", 12.0, x + width[num_scores + 2] / 2 - my_draw_text("Rank", NULL, 12.0) / 2, 100); // show all the players and the scores - unsigned show_players = std::min(group.players.size(), 9U); + unsigned num_players_this_machine = (group.players.size() + num_machines - machine - 1) / num_machines; + unsigned show_players = std::min(num_players_this_machine, 9U); unsigned y = (show_players <= 7) ? 140 : (140 - (show_players - 7) * 5); - unsigned row = 0; - for (std::vector::const_iterator i = group.players.begin(); i != group.players.end() && row < 9; ++i, ++row) { + unsigned row = 0, m = 0; + for (std::vector::const_iterator i = group.players.begin(); i != group.players.end() && row < 9; ++i) { + if (m++ % num_machines != machine) + continue; + my_draw_text_deferred(td, i->nick, 18.0, 20, y); unsigned x = 40 + width[0]; @@ -190,6 +194,8 @@ void GroupScreen::draw(unsigned char *buf) y += 40 - (show_players - 7) * 4; else y += 40; + ++row; + } /* @@ -238,7 +244,7 @@ void GroupScreen::draw(unsigned char *buf) // now finally find min and max rank, and draw it all y = (show_players <= 7) ? 140 : (140 - (show_players - 7) * 5); - for (unsigned i = 0; i < show_players; ++i) { + for (unsigned i = 0; i < group.players.size() && (i/num_machines) < show_players; ++i) { unsigned best_rank = 1, worst_rank = 1; for (unsigned j = 0; j < group.players.size(); ++j) { if (i == j) @@ -256,6 +262,9 @@ void GroupScreen::draw(unsigned char *buf) else std::sprintf(text, "%u-%u", best_rank, worst_rank); + if (i % num_machines != machine) + continue; + unsigned this_width = my_draw_text(text, NULL, 22.0); my_draw_text_deferred(td, text, 22.0, x + width[num_scores + 2] / 2 - this_width / 2, y); @@ -284,9 +293,10 @@ void GroupScreen::draw(unsigned char *buf) * Needs to win group: */ - /* Find the first player with the fewest songs played. */ + /* Find the first player with the fewest songs played and part of this machine. */ unsigned min_played_songs = 9999, num_random_songs = 0; Player *next_player = NULL; + m = 0; 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) { @@ -296,7 +306,7 @@ void GroupScreen::draw(unsigned char *buf) ++this_random_songs; } - if (this_played < min_played_songs) { + if ((m++ % num_machines == machine) && this_played < min_played_songs) { min_played_songs = this_played; next_player = &(*i); num_random_songs = this_random_songs; // should be equal for all diff --git a/bigscreen/groupscreen.h b/bigscreen/groupscreen.h index 3d24403..21ab172 100644 --- a/bigscreen/groupscreen.h +++ b/bigscreen/groupscreen.h @@ -14,7 +14,7 @@ /* A screen class showing a group in the tournament */ class GroupScreen : public GenericScreen { private: - unsigned tournament, round, parallel; + unsigned tournament, round, parallel, machine, num_machines; FlagTrigger scores_changed; pqxx::connection &conn; bool valid; @@ -22,7 +22,7 @@ private: std::vector last_text; public: - GroupScreen(pqxx::connection &conn, unsigned tournament, unsigned round, unsigned parallel); + GroupScreen(pqxx::connection &conn, unsigned tournament, unsigned round, unsigned parallel, unsigned machine, unsigned num_machines); virtual ~GroupScreen(); bool check_invalidated(); -- 2.39.2