support JSON rare item sets

This commit is contained in:
Martin Michelsen
2023-06-29 22:20:39 -07:00
parent b324173d8e
commit 4442ca0250
7 changed files with 258 additions and 31 deletions
+33 -6
View File
@@ -190,7 +190,7 @@ JSONRareItemSet::JSONRareItemSet(std::shared_ptr<const JSONObject> json) {
uint8_t section_id = section_id_for_name(section_id_it.first);
auto& collection = this->collections[this->key_for_params(mode, episode, difficulty, section_id)];
for (const auto& item_it : difficulty_it.second->as_dict()) {
for (const auto& item_it : section_id_it.second->as_dict()) {
vector<ExpandedDrop>* target;
if (starts_with(item_it.first, "Box-")) {
uint8_t area = drop_area_for_name(item_it.first.substr(4));
@@ -209,11 +209,38 @@ JSONRareItemSet::JSONRareItemSet(std::shared_ptr<const JSONObject> json) {
for (const auto& spec_json : item_it.second->as_list()) {
auto& spec_list = spec_json->as_list();
auto& d = target->emplace_back();
d.probability = spec_list.at(0)->as_int();
uint32_t item_code = spec_list.at(1)->as_int();
d.item_code[0] = (item_code >> 16) & 0xFF;
d.item_code[1] = (item_code >> 8) & 0xFF;
d.item_code[2] = item_code & 0xFF;
auto prob_desc = spec_list.at(1);
if (prob_desc->is_int()) {
d.probability = spec_list.at(0)->as_int();
} else if (prob_desc->is_string()) {
auto tokens = split(prob_desc->as_string(), '/');
if (tokens.size() != 2) {
throw runtime_error("invalid probability specification");
}
uint64_t numerator = stoull(tokens[0], nullptr, 0);
uint64_t denominator = stoull(tokens[1], nullptr, 0);
if (numerator == denominator) {
d.probability = 0xFFFFFFFF;
} else {
d.probability = (static_cast<uint64_t>(numerator) << 32) / denominator;
}
}
auto item_desc = spec_list.at(1);
if (item_desc->is_int()) {
uint32_t item_code = spec_list.at(1)->as_int();
d.item_code[0] = (item_code >> 16) & 0xFF;
d.item_code[1] = (item_code >> 8) & 0xFF;
d.item_code[2] = item_code & 0xFF;
} else if (item_desc->is_string()) {
ItemData data(item_desc->as_string());
d.item_code[0] = data.data1[0];
d.item_code[1] = data.data1[1];
d.item_code[2] = data.data1[2];
} else {
throw runtime_error("invalid item description type");
}
}
}
}