show original filenames in quest load logs
This commit is contained in:
+55
-58
@@ -462,10 +462,14 @@ QuestIndex::QuestIndex(
|
|||||||
: directory(directory),
|
: directory(directory),
|
||||||
category_index(category_index) {
|
category_index(category_index) {
|
||||||
|
|
||||||
map<string, shared_ptr<const string>> bin_files;
|
struct FileData {
|
||||||
map<string, shared_ptr<const string>> dat_files;
|
std::string filename;
|
||||||
map<string, shared_ptr<const string>> pvr_files;
|
shared_ptr<const string> data;
|
||||||
map<string, shared_ptr<const string>> json_files;
|
};
|
||||||
|
map<string, FileData> bin_files;
|
||||||
|
map<string, FileData> dat_files;
|
||||||
|
map<string, FileData> pvr_files;
|
||||||
|
map<string, FileData> json_files;
|
||||||
map<string, uint32_t> categories;
|
map<string, uint32_t> categories;
|
||||||
for (const auto& cat : this->category_index->categories) {
|
for (const auto& cat : this->category_index->categories) {
|
||||||
// Don't index Ep3 download categories for non-Ep3 quest indexing, and vice
|
// Don't index Ep3 download categories for non-Ep3 quest indexing, and vice
|
||||||
@@ -474,13 +478,13 @@ QuestIndex::QuestIndex(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto add_file = [&](map<string, shared_ptr<const string>>& files, const string& name, string&& value) {
|
auto add_file = [&](map<string, FileData>& files, const string& basename, const string& filename, string&& value) {
|
||||||
if (categories.emplace(name, cat->category_id).first->second != cat->category_id) {
|
if (categories.emplace(basename, cat->category_id).first->second != cat->category_id) {
|
||||||
throw runtime_error("file " + name + " exists in multiple categories");
|
throw runtime_error("file " + basename + " exists in multiple categories");
|
||||||
}
|
}
|
||||||
auto data_ptr = make_shared<string>(std::move(value));
|
auto data_ptr = make_shared<string>(std::move(value));
|
||||||
if (!files.emplace(name, data_ptr).second) {
|
if (!files.emplace(basename, FileData{filename, data_ptr}).second) {
|
||||||
throw runtime_error("file " + name + " already exists");
|
throw runtime_error("file " + basename + " already exists");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -492,6 +496,7 @@ QuestIndex::QuestIndex(
|
|||||||
for (string filename : list_directory_sorted(cat_path)) {
|
for (string filename : list_directory_sorted(cat_path)) {
|
||||||
string file_path = cat_path + "/" + filename;
|
string file_path = cat_path + "/" + filename;
|
||||||
try {
|
try {
|
||||||
|
string orig_filename = filename;
|
||||||
string file_data;
|
string file_data;
|
||||||
if (ends_with(filename, ".gci")) {
|
if (ends_with(filename, ".gci")) {
|
||||||
file_data = decode_gci_data(load_file(file_path));
|
file_data = decode_gci_data(load_file(file_path));
|
||||||
@@ -523,26 +528,26 @@ QuestIndex::QuestIndex(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (extension == "json") {
|
if (extension == "json") {
|
||||||
add_file(json_files, file_basename, std::move(file_data));
|
add_file(json_files, file_basename, orig_filename, std::move(file_data));
|
||||||
} else if (extension == "bin" || extension == "mnm") {
|
} else if (extension == "bin" || extension == "mnm") {
|
||||||
add_file(bin_files, file_basename, std::move(file_data));
|
add_file(bin_files, file_basename, orig_filename, std::move(file_data));
|
||||||
} else if (extension == "bind" || extension == "mnmd") {
|
} else if (extension == "bind" || extension == "mnmd") {
|
||||||
add_file(bin_files, file_basename, prs_compress_optimal(file_data));
|
add_file(bin_files, file_basename, orig_filename, prs_compress_optimal(file_data));
|
||||||
} else if (extension == "dat") {
|
} else if (extension == "dat") {
|
||||||
add_file(dat_files, file_basename, std::move(file_data));
|
add_file(dat_files, file_basename, orig_filename, std::move(file_data));
|
||||||
} else if (extension == "datd") {
|
} else if (extension == "datd") {
|
||||||
add_file(dat_files, file_basename, prs_compress_optimal(file_data));
|
add_file(dat_files, file_basename, orig_filename, prs_compress_optimal(file_data));
|
||||||
} else if (extension == "pvr") {
|
} else if (extension == "pvr") {
|
||||||
add_file(pvr_files, file_basename, std::move(file_data));
|
add_file(pvr_files, file_basename, orig_filename, std::move(file_data));
|
||||||
} else if (extension == "qst") {
|
} else if (extension == "qst") {
|
||||||
auto files = decode_qst_data(file_data);
|
auto files = decode_qst_data(file_data);
|
||||||
for (auto& it : files) {
|
for (auto& it : files) {
|
||||||
if (ends_with(it.first, ".bin")) {
|
if (ends_with(it.first, ".bin")) {
|
||||||
add_file(bin_files, file_basename, std::move(it.second));
|
add_file(bin_files, file_basename, orig_filename, std::move(it.second));
|
||||||
} else if (ends_with(it.first, ".dat")) {
|
} else if (ends_with(it.first, ".dat")) {
|
||||||
add_file(dat_files, file_basename, std::move(it.second));
|
add_file(dat_files, file_basename, orig_filename, std::move(it.second));
|
||||||
} else if (ends_with(it.first, ".pvr")) {
|
} else if (ends_with(it.first, ".pvr")) {
|
||||||
add_file(pvr_files, file_basename, std::move(it.second));
|
add_file(pvr_files, file_basename, orig_filename, std::move(it.second));
|
||||||
} else {
|
} else {
|
||||||
throw runtime_error("qst file contains unsupported file type: " + it.first);
|
throw runtime_error("qst file contains unsupported file type: " + it.first);
|
||||||
}
|
}
|
||||||
@@ -562,7 +567,7 @@ QuestIndex::QuestIndex(
|
|||||||
// should be indexed
|
// should be indexed
|
||||||
for (auto& bin_it : bin_files) {
|
for (auto& bin_it : bin_files) {
|
||||||
const string& basename = bin_it.first;
|
const string& basename = bin_it.first;
|
||||||
shared_ptr<const string> bin_contents = bin_it.second;
|
const auto* bin_filedata = &bin_it.second;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Quest .bin filenames are like K###-VERS-LANG.EXT, where:
|
// Quest .bin filenames are like K###-VERS-LANG.EXT, where:
|
||||||
@@ -616,31 +621,25 @@ QuestIndex::QuestIndex(
|
|||||||
uint8_t language = language_code_for_char(language_token[0]);
|
uint8_t language = language_code_for_char(language_token[0]);
|
||||||
|
|
||||||
// Find the corresponding dat and pvr files
|
// Find the corresponding dat and pvr files
|
||||||
string dat_filename;
|
const FileData* dat_filedata = nullptr;
|
||||||
string pvr_filename;
|
const FileData* pvr_filedata = nullptr;
|
||||||
shared_ptr<const string> dat_contents;
|
|
||||||
shared_ptr<const string> pvr_contents;
|
|
||||||
if (!::is_ep3(version)) {
|
if (!::is_ep3(version)) {
|
||||||
// Look for dat and pvr files with the same basename as the bin file; if
|
// Look for dat and pvr files with the same basename as the bin file; if
|
||||||
// not found, look for them without the language suffix
|
// not found, look for them without the language suffix
|
||||||
try {
|
try {
|
||||||
dat_filename = basename;
|
dat_filedata = &dat_files.at(basename);
|
||||||
dat_contents = dat_files.at(dat_filename);
|
|
||||||
} catch (const out_of_range&) {
|
} catch (const out_of_range&) {
|
||||||
try {
|
try {
|
||||||
dat_filename = quest_number_token + "-" + version_token;
|
dat_filedata = &dat_files.at(quest_number_token + "-" + version_token);
|
||||||
dat_contents = dat_files.at(dat_filename);
|
|
||||||
} catch (const out_of_range&) {
|
} catch (const out_of_range&) {
|
||||||
throw runtime_error("no dat file found for bin file " + basename);
|
throw runtime_error("no dat file found for bin file " + basename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
pvr_filename = basename;
|
pvr_filedata = &pvr_files.at(basename);
|
||||||
pvr_contents = pvr_files.at(pvr_filename);
|
|
||||||
} catch (const out_of_range&) {
|
} catch (const out_of_range&) {
|
||||||
try {
|
try {
|
||||||
pvr_filename = quest_number_token + "-" + version_token;
|
pvr_filedata = &pvr_files.at(quest_number_token + "-" + version_token);
|
||||||
pvr_contents = pvr_files.at(pvr_filename);
|
|
||||||
} catch (const out_of_range&) {
|
} catch (const out_of_range&) {
|
||||||
// pvr files aren't required (and most quests do not have them), so
|
// pvr files aren't required (and most quests do not have them), so
|
||||||
// don't fail if it's missing
|
// don't fail if it's missing
|
||||||
@@ -649,28 +648,25 @@ QuestIndex::QuestIndex(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Load the quest's metadata JSON file, if it exists
|
// Load the quest's metadata JSON file, if it exists
|
||||||
string json_filename;
|
const FileData* json_filedata = nullptr;
|
||||||
JSON metadata_json = nullptr;
|
|
||||||
shared_ptr<BattleRules> battle_rules;
|
shared_ptr<BattleRules> battle_rules;
|
||||||
ssize_t challenge_template_index = -1;
|
ssize_t challenge_template_index = -1;
|
||||||
shared_ptr<const QuestAvailabilityExpression> available_expression;
|
shared_ptr<const QuestAvailabilityExpression> available_expression;
|
||||||
shared_ptr<const QuestAvailabilityExpression> enabled_expression;
|
shared_ptr<const QuestAvailabilityExpression> enabled_expression;
|
||||||
try {
|
try {
|
||||||
json_filename = basename;
|
json_filedata = &json_files.at(basename);
|
||||||
metadata_json = JSON::parse(*json_files.at(json_filename));
|
|
||||||
} catch (const out_of_range&) {
|
} catch (const out_of_range&) {
|
||||||
try {
|
try {
|
||||||
json_filename = quest_number_token + "-" + version_token;
|
json_filedata = &json_files.at(quest_number_token + "-" + version_token);
|
||||||
metadata_json = JSON::parse(*json_files.at(json_filename));
|
|
||||||
} catch (const out_of_range&) {
|
} catch (const out_of_range&) {
|
||||||
try {
|
try {
|
||||||
json_filename = quest_number_token;
|
json_filedata = &json_files.at(quest_number_token);
|
||||||
metadata_json = JSON::parse(*json_files.at(json_filename));
|
|
||||||
} catch (const out_of_range&) {
|
} catch (const out_of_range&) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!metadata_json.is_null()) {
|
if (json_filedata) {
|
||||||
|
auto metadata_json = JSON::parse(*json_filedata->data);
|
||||||
try {
|
try {
|
||||||
battle_rules = make_shared<BattleRules>(metadata_json.at("BattleRules"));
|
battle_rules = make_shared<BattleRules>(metadata_json.at("BattleRules"));
|
||||||
} catch (const out_of_range&) {
|
} catch (const out_of_range&) {
|
||||||
@@ -694,36 +690,40 @@ QuestIndex::QuestIndex(
|
|||||||
category_id,
|
category_id,
|
||||||
version,
|
version,
|
||||||
language,
|
language,
|
||||||
bin_contents,
|
bin_filedata->data,
|
||||||
dat_contents,
|
dat_filedata ? dat_filedata->data : nullptr,
|
||||||
pvr_contents,
|
pvr_filedata ? pvr_filedata->data : nullptr,
|
||||||
battle_rules,
|
battle_rules,
|
||||||
challenge_template_index,
|
challenge_template_index,
|
||||||
available_expression,
|
available_expression,
|
||||||
enabled_expression);
|
enabled_expression);
|
||||||
|
|
||||||
auto category_name = this->category_index->at(vq->category_id)->name;
|
auto category_name = this->category_index->at(vq->category_id)->name;
|
||||||
string dat_str = dat_filename.empty() ? "" : (" with layout from " + dat_filename + ".dat");
|
string filenames_str = bin_filedata->filename;
|
||||||
string battle_rules_str = battle_rules ? (" with battle rules from " + json_filename + ".json") : "";
|
if (dat_filedata) {
|
||||||
string challenge_template_str = (challenge_template_index >= 0) ? string_printf(" with challenge template index %zd", vq->challenge_template_index) : "";
|
filenames_str += string_printf("/%s", dat_filedata->filename.c_str());
|
||||||
|
}
|
||||||
|
if (pvr_filedata) {
|
||||||
|
filenames_str += string_printf("/%s", pvr_filedata->filename.c_str());
|
||||||
|
}
|
||||||
|
if (json_filedata) {
|
||||||
|
filenames_str += string_printf("/%s", json_filedata->filename.c_str());
|
||||||
|
}
|
||||||
auto q_it = this->quests_by_number.find(vq->quest_number);
|
auto q_it = this->quests_by_number.find(vq->quest_number);
|
||||||
if (q_it != this->quests_by_number.end()) {
|
if (q_it != this->quests_by_number.end()) {
|
||||||
q_it->second->add_version(vq);
|
q_it->second->add_version(vq);
|
||||||
static_game_data_log.info("(%s) Added %s %c version of quest %" PRIu32 " (%s)%s%s%s",
|
static_game_data_log.info("(%s) Added %s %c version of quest %" PRIu32 " (%s)",
|
||||||
basename.c_str(),
|
filenames_str.c_str(),
|
||||||
name_for_enum(vq->version),
|
name_for_enum(vq->version),
|
||||||
char_for_language_code(vq->language),
|
char_for_language_code(vq->language),
|
||||||
vq->quest_number,
|
vq->quest_number,
|
||||||
vq->name.c_str(),
|
vq->name.c_str());
|
||||||
dat_str.c_str(),
|
|
||||||
battle_rules_str.c_str(),
|
|
||||||
challenge_template_str.c_str());
|
|
||||||
} else {
|
} else {
|
||||||
auto q = make_shared<Quest>(vq);
|
auto q = make_shared<Quest>(vq);
|
||||||
this->quests_by_number.emplace(vq->quest_number, q);
|
this->quests_by_number.emplace(vq->quest_number, q);
|
||||||
this->quests_by_category_id_and_number[q->category_id].emplace(vq->quest_number, q);
|
this->quests_by_category_id_and_number[q->category_id].emplace(vq->quest_number, q);
|
||||||
static_game_data_log.info("(%s) Created %s %c quest %" PRIu32 " (%s) (%s, %s (%" PRIu32 "), %s)%s%s%s",
|
static_game_data_log.info("(%s) Created %s %c quest %" PRIu32 " (%s) (%s, %s (%" PRIu32 "), %s)",
|
||||||
basename.c_str(),
|
filenames_str.c_str(),
|
||||||
name_for_enum(vq->version),
|
name_for_enum(vq->version),
|
||||||
char_for_language_code(vq->language),
|
char_for_language_code(vq->language),
|
||||||
vq->quest_number,
|
vq->quest_number,
|
||||||
@@ -731,10 +731,7 @@ QuestIndex::QuestIndex(
|
|||||||
name_for_episode(vq->episode),
|
name_for_episode(vq->episode),
|
||||||
category_name.c_str(),
|
category_name.c_str(),
|
||||||
vq->category_id,
|
vq->category_id,
|
||||||
vq->joinable ? "joinable" : "not joinable",
|
vq->joinable ? "joinable" : "not joinable");
|
||||||
dat_str.c_str(),
|
|
||||||
battle_rules_str.c_str(),
|
|
||||||
challenge_template_str.c_str());
|
|
||||||
}
|
}
|
||||||
} catch (const exception& e) {
|
} catch (const exception& e) {
|
||||||
static_game_data_log.warning("(%s) Failed to index quest file: (%s)", basename.c_str(), e.what());
|
static_game_data_log.warning("(%s) Failed to index quest file: (%s)", basename.c_str(), e.what());
|
||||||
|
|||||||
Reference in New Issue
Block a user