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 {
|
namespace Episode3 {
|
||||||
|
|
||||||
Tournament::PlayerEntry::PlayerEntry(uint32_t serial_number)
|
Tournament::PlayerEntry::PlayerEntry(uint32_t serial_number, const string& player_name)
|
||||||
: serial_number(serial_number) {}
|
: serial_number(serial_number),
|
||||||
|
player_name(player_name) {}
|
||||||
|
|
||||||
Tournament::PlayerEntry::PlayerEntry(shared_ptr<Client> c)
|
Tournament::PlayerEntry::PlayerEntry(shared_ptr<Client> c)
|
||||||
: serial_number(c->license->serial_number),
|
: serial_number(c->license->serial_number),
|
||||||
client(c) {}
|
client(c),
|
||||||
|
player_name(encode_sjis(c->game_data.player()->disp.name)) {}
|
||||||
|
|
||||||
Tournament::PlayerEntry::PlayerEntry(
|
Tournament::PlayerEntry::PlayerEntry(
|
||||||
shared_ptr<const COMDeckDefinition> com_deck)
|
shared_ptr<const COMDeckDefinition> com_deck)
|
||||||
@@ -53,7 +55,11 @@ string Tournament::Team::str() const {
|
|||||||
this->password.c_str(), this->num_rounds_cleared);
|
this->password.c_str(), this->num_rounds_cleared);
|
||||||
for (const auto& player : this->players) {
|
for (const auto& player : this->players) {
|
||||||
if (player.is_human()) {
|
if (player.is_human()) {
|
||||||
|
if (player.player_name.empty()) {
|
||||||
ret += string_printf(" %08" PRIX32, player.serial_number);
|
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 + "]";
|
return ret + "]";
|
||||||
@@ -366,11 +372,18 @@ void Tournament::init() {
|
|||||||
team->password = team_json->get_string("password");
|
team->password = team_json->get_string("password");
|
||||||
team_index_to_rounds_cleared.emplace_back(team_json->get_int("num_rounds_cleared"));
|
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")) {
|
for (const auto& player_json : team_json->get_list("player_specs")) {
|
||||||
if (player_json->is_int()) {
|
if (player_json->is_list()) {
|
||||||
team->players.emplace_back(player_json->as_int());
|
uint32_t serial_number = player_json->at(0).as_int();
|
||||||
this->all_player_serial_numbers.emplace(player_json->as_int());
|
team->players.emplace_back(serial_number, player_json->at(1).as_string());
|
||||||
} else {
|
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()));
|
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();
|
auto players_list = JSON::list();
|
||||||
for (const auto& player : team->players) {
|
for (const auto& player : team->players) {
|
||||||
if (player.is_human()) {
|
if (player.is_human()) {
|
||||||
|
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);
|
players_list.emplace_back(player.serial_number);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
players_list.emplace_back(player.com_deck->deck_name);
|
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
|
// client is valid if serial_number is nonzero and the client is connected
|
||||||
std::weak_ptr<Client> client;
|
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<Client> c);
|
||||||
explicit PlayerEntry(std::shared_ptr<const COMDeckDefinition> com_deck);
|
explicit PlayerEntry(std::shared_ptr<const COMDeckDefinition> com_deck);
|
||||||
|
|
||||||
bool is_com() const;
|
bool is_com() const;
|
||||||
bool is_human() const;
|
bool is_human() const;
|
||||||
|
|
||||||
|
JSON json() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Team : public std::enable_shared_from_this<Team> {
|
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()) {
|
if (team->name.empty()) {
|
||||||
message = "(No registrant)";
|
message = "(No registrant)";
|
||||||
} else if (team->max_players == 1) {
|
} 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->name.c_str(),
|
||||||
team->num_rounds_cleared,
|
team->num_rounds_cleared,
|
||||||
team->num_rounds_cleared == 1 ? "win" : "wins");
|
team->num_rounds_cleared == 1 ? "win" : "wins");
|
||||||
} else {
|
} 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->name.c_str(),
|
||||||
team->num_human_players(),
|
|
||||||
team->num_com_players(),
|
|
||||||
team->num_rounds_cleared,
|
team->num_rounds_cleared,
|
||||||
team->num_rounds_cleared == 1 ? "win" : "wins",
|
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));
|
send_ship_info(c, decode_sjis(message));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user