save player names along with tournament entries and show them in info window

This commit is contained in:
Martin Michelsen
2023-09-24 11:17:11 -07:00
parent 6b5e672ebb
commit 0c2ecd4ebb
3 changed files with 44 additions and 15 deletions
+26 -9
View File
@@ -9,12 +9,14 @@ using namespace std;
namespace Episode3 {
Tournament::PlayerEntry::PlayerEntry(uint32_t serial_number)
: serial_number(serial_number) {}
Tournament::PlayerEntry::PlayerEntry(uint32_t serial_number, const string& player_name)
: serial_number(serial_number),
player_name(player_name) {}
Tournament::PlayerEntry::PlayerEntry(shared_ptr<Client> c)
: serial_number(c->license->serial_number),
client(c) {}
client(c),
player_name(encode_sjis(c->game_data.player()->disp.name)) {}
Tournament::PlayerEntry::PlayerEntry(
shared_ptr<const COMDeckDefinition> com_deck)
@@ -53,7 +55,11 @@ string Tournament::Team::str() const {
this->password.c_str(), this->num_rounds_cleared);
for (const auto& player : this->players) {
if (player.is_human()) {
ret += string_printf(" %08" PRIX32, player.serial_number);
if (player.player_name.empty()) {
ret += string_printf(" %08" PRIX32, player.serial_number);
} else {
ret += string_printf(" %08" PRIX32 " (%s)", player.serial_number, player.player_name.c_str());
}
}
}
return ret + "]";
@@ -366,11 +372,18 @@ void Tournament::init() {
team->password = team_json->get_string("password");
team_index_to_rounds_cleared.emplace_back(team_json->get_int("num_rounds_cleared"));
for (const auto& player_json : team_json->get_list("player_specs")) {
if (player_json->is_int()) {
team->players.emplace_back(player_json->as_int());
this->all_player_serial_numbers.emplace(player_json->as_int());
} else {
if (player_json->is_list()) {
uint32_t serial_number = player_json->at(0).as_int();
team->players.emplace_back(serial_number, player_json->at(1).as_string());
this->all_player_serial_numbers.emplace(serial_number);
} else if (player_json->is_int()) {
uint32_t serial_number = player_json->as_int();
team->players.emplace_back(serial_number);
this->all_player_serial_numbers.emplace(serial_number);
} else if (player_json->is_string()) {
team->players.emplace_back(this->com_deck_index->deck_for_name(player_json->as_string()));
} else {
throw runtime_error("invalid player spec");
}
}
}
@@ -499,7 +512,11 @@ JSON Tournament::json() const {
auto players_list = JSON::list();
for (const auto& player : team->players) {
if (player.is_human()) {
players_list.emplace_back(player.serial_number);
if (!player.player_name.empty()) {
players_list.emplace_back(JSON::list({player.serial_number, player.player_name}));
} else {
players_list.emplace_back(player.serial_number);
}
} else {
players_list.emplace_back(player.com_deck->deck_name);
}
+4 -1
View File
@@ -42,13 +42,16 @@ public:
// client is valid if serial_number is nonzero and the client is connected
std::weak_ptr<Client> client;
std::string player_name; // Not used for COM decks
explicit PlayerEntry(uint32_t serial_number);
explicit PlayerEntry(uint32_t serial_number, const std::string& player_name = "");
explicit PlayerEntry(std::shared_ptr<Client> c);
explicit PlayerEntry(std::shared_ptr<const COMDeckDefinition> com_deck);
bool is_com() const;
bool is_human() const;
JSON json() const;
};
struct Team : public std::enable_shared_from_this<Team> {
+14 -5
View File
@@ -1517,18 +1517,27 @@ static void on_09(shared_ptr<Client> c, uint16_t, uint32_t, const string& data)
if (team->name.empty()) {
message = "(No registrant)";
} else if (team->max_players == 1) {
message = string_printf("$C6%s$C7\n%zu %s",
message = string_printf("$C6%s$C7\n%zu %s\nPlayers:",
team->name.c_str(),
team->num_rounds_cleared,
team->num_rounds_cleared == 1 ? "win" : "wins");
} else {
message = string_printf("$C6%s$C7\n%zuH/%zuC\n%zu %s\n%s",
message = string_printf("$C6%s$C7\n%zu %s%s\nPlayers:",
team->name.c_str(),
team->num_human_players(),
team->num_com_players(),
team->num_rounds_cleared,
team->num_rounds_cleared == 1 ? "win" : "wins",
team->password.empty() ? "" : "Locked");
team->password.empty() ? "" : "\n$C4Locked$C7");
}
for (const auto& player : team->players) {
if (player.is_human()) {
if (player.player_name.empty()) {
message += string_printf("\n $C6%08" PRIX32 "$C7", player.serial_number);
} else {
message += string_printf("\n $C6%s$C7 (%08" PRIX32 ")", player.player_name.c_str(), player.serial_number);
}
} else {
message += string_printf("\n $C3%s \"%s\"$C7", player.com_deck->player_name.c_str(), player.com_deck->deck_name.c_str());
}
}
send_ship_info(c, decode_sjis(message));
} else {