diff --git a/src/Lobby.cc b/src/Lobby.cc index ec4695de..4b20f6d0 100644 --- a/src/Lobby.cc +++ b/src/Lobby.cc @@ -270,14 +270,16 @@ shared_ptr Lobby::load_maps( shared_ptr rare_rates, shared_ptr random_crypt, shared_ptr vq) { + if (!vq->dat_contents_decompressed) { + throw runtime_error("quest does not have DAT data"); + } auto map = make_shared(version, lobby_id, random_crypt); - auto dat_contents = prs_decompress(*vq->dat_contents); map->add_enemies_and_objects_from_quest_data( episode, difficulty, event, - dat_contents.data(), - dat_contents.size(), + vq->dat_contents_decompressed->data(), + vq->dat_contents_decompressed->size(), rare_rates); return map; } diff --git a/src/Quest.cc b/src/Quest.cc index fa97f3aa..03f74577 100644 --- a/src/Quest.cc +++ b/src/Quest.cc @@ -222,6 +222,10 @@ VersionedQuest::VersionedQuest( available_expression(available_expression), enabled_expression(enabled_expression) { + if (this->dat_contents) { + this->dat_contents_decompressed = make_shared(prs_decompress(*this->dat_contents)); + } + auto bin_decompressed = prs_decompress(*this->bin_contents); switch (this->version) { diff --git a/src/Quest.hh b/src/Quest.hh index 864a35d0..ab88d4ac 100644 --- a/src/Quest.hh +++ b/src/Quest.hh @@ -68,6 +68,7 @@ struct VersionedQuest { std::string long_description; std::shared_ptr bin_contents; std::shared_ptr dat_contents; + std::shared_ptr dat_contents_decompressed; std::shared_ptr pvr_contents; std::shared_ptr battle_rules; ssize_t challenge_template_index; diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index b199e3ee..5170c012 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -3012,9 +3012,6 @@ static void on_battle_restart_bb(shared_ptr c, uint8_t, uint8_t, void* d l->leader_id == c->lobby_client_id) { const auto& cmd = check_size_t(data, size); - auto vq = l->quest->version(Version::BB_V4, c->language()); - auto dat_contents = prs_decompress(*vq->dat_contents); - auto new_rules = make_shared(cmd.rules); if (l->item_creator) { l->item_creator->set_restrictions(new_rules);