save player names along with tournament entries and show them in info window
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user