From 2235103efec99d9a3e16f60984f59576a3525322 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Mon, 28 Aug 2023 22:18:17 -0700 Subject: [PATCH] resolve auction card IDs at load time --- src/SendCommands.cc | 14 +++++++------- src/ServerState.cc | 23 +++++++++++++++-------- src/ServerState.hh | 8 +++++++- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/SendCommands.cc b/src/SendCommands.cc index 0aad89f7..c3d3a449 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -2805,8 +2805,8 @@ void send_card_auction_if_all_clients_ready( num_cards = min(num_cards, 0x14); uint64_t distribution_size = 0; - for (const auto& it : s->ep3_card_auction_pool) { - distribution_size += it.second.first; + for (const auto& e : s->ep3_card_auction_pool) { + distribution_size += e.probability; } auto card_index = (l->flags & Lobby::Flag::IS_EP3_TRIAL) @@ -2817,12 +2817,12 @@ void send_card_auction_if_all_clients_ready( cmd.points_available = s->ep3_card_auction_points; for (size_t z = 0; z < num_cards; z++) { uint64_t v = random_object() % distribution_size; - for (const auto& it : s->ep3_card_auction_pool) { - if (v >= it.second.first) { - v -= it.second.first; + for (const auto& e : s->ep3_card_auction_pool) { + if (v >= e.probability) { + v -= e.probability; } else { - cmd.entries[z].card_id = card_index->definition_for_name(it.first)->def.card_id.load(); - cmd.entries[z].min_price = it.second.second; + cmd.entries[z].card_id = e.card_id; + cmd.entries[z].min_price = e.min_price; break; } } diff --git a/src/ServerState.cc b/src/ServerState.cc index c45cb077..0183b329 100644 --- a/src/ServerState.cc +++ b/src/ServerState.cc @@ -640,13 +640,13 @@ void ServerState::parse_config(const JSON& json) { this->ep3_card_auction_max_size = 0; } - try { - for (const auto& it : json.at("CardAuctionPool").as_dict()) { - const auto& card_name = it.first; - const auto& card_cfg_json = it.second.as_list(); - this->ep3_card_auction_pool.emplace(card_name, make_pair(card_cfg_json.at(0), card_cfg_json.at(1))); - } - } catch (const out_of_range&) { + for (const auto& it : json.at("CardAuctionPool").as_dict()) { + this->ep3_card_auction_pool.emplace_back( + CardAuctionPoolEntry{ + .probability = it.second.at(0), + .card_id = 0, + .min_price = it.second.at(1), + .card_name = it.first}); } set_log_levels_from_json(json.get("LogLevels", JSON::dict_type())); @@ -829,7 +829,14 @@ void ServerState::load_ep3_data() { } config_log.info("Resolving Episode 3 card auction pool"); - TODO; + for (auto& e : this->ep3_card_auction_pool) { + try { + const auto& card = this->ep3_card_index->definition_for_name(e.card_name); + e.card_id = card->def.card_id; + } catch (const out_of_range&) { + throw runtime_error(string_printf("Ep3 card \"%s\" does not exist", e.card_name.c_str())); + } + } } void ServerState::load_quest_index() { diff --git a/src/ServerState.hh b/src/ServerState.hh index 4d788257..9d3616b4 100644 --- a/src/ServerState.hh +++ b/src/ServerState.hh @@ -92,7 +92,13 @@ struct ServerState { uint16_t ep3_card_auction_points; uint16_t ep3_card_auction_min_size; uint16_t ep3_card_auction_max_size; - std::unordered_map> ep3_card_auction_pool; + struct CardAuctionPoolEntry { + uint64_t probability; + uint16_t card_id; + uint16_t min_price; + std::string card_name; + }; + std::vector ep3_card_auction_pool; std::shared_ptr license_manager;