support JSON rare item sets
This commit is contained in:
+33
-6
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user