diff --git a/src/Episode3/Tournament.cc b/src/Episode3/Tournament.cc index 5ac4b6b8..d9eda795 100644 --- a/src/Episode3/Tournament.cc +++ b/src/Episode3/Tournament.cc @@ -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 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 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); } diff --git a/src/Episode3/Tournament.hh b/src/Episode3/Tournament.hh index 6a541e67..f5575bd7 100644 --- a/src/Episode3/Tournament.hh +++ b/src/Episode3/Tournament.hh @@ -42,13 +42,16 @@ public: // client is valid if serial_number is nonzero and the client is connected std::weak_ptr 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 c); explicit PlayerEntry(std::shared_ptr com_deck); bool is_com() const; bool is_human() const; + + JSON json() const; }; struct Team : public std::enable_shared_from_this { diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index 91f3de22..7dd75268 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -1517,18 +1517,27 @@ static void on_09(shared_ptr 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 {