+
+ u32 damage_groups_size = readU32(is);
+ for (u32 i = 0; i < damage_groups_size; i++) {
+ std::string name = deSerializeString(is);
+ s16 rating = readS16(is);
+ damageGroups[name] = rating;
+ }
+}
+
+void ToolCapabilities::serializeJson(std::ostream &os) const
+{
+ Json::Value root;
+ root["full_punch_interval"] = full_punch_interval;
+ root["max_drop_level"] = max_drop_level;
+
+ Json::Value groupcaps_object;
+ for (auto groupcap : groupcaps) {
+ groupcap.second.toJson(groupcaps_object[groupcap.first]);
+ }
+ root["groupcaps"] = groupcaps_object;
+
+ Json::Value damage_groups_object;
+ DamageGroup::const_iterator dgiter;
+ for (dgiter = damageGroups.begin(); dgiter != damageGroups.end(); ++dgiter) {
+ damage_groups_object[dgiter->first] = dgiter->second;
+ }
+ root["damage_groups"] = damage_groups_object;
+
+ os << root;
+}
+
+void ToolCapabilities::deserializeJson(std::istream &is)
+{
+ Json::Value root;
+ is >> root;
+ if (root.isObject()) {
+ if (root["full_punch_interval"].isDouble())
+ full_punch_interval = root["full_punch_interval"].asFloat();
+ if (root["max_drop_level"].isInt())
+ max_drop_level = root["max_drop_level"].asInt();
+
+ Json::Value &groupcaps_object = root["groupcaps"];
+ if (groupcaps_object.isObject()) {
+ Json::ValueIterator gciter;
+ for (gciter = groupcaps_object.begin();
+ gciter != groupcaps_object.end(); ++gciter) {
+ ToolGroupCap groupcap;
+ groupcap.fromJson(*gciter);
+ groupcaps[gciter.key().asString()] = groupcap;
+ }
+ }
+
+ Json::Value &damage_groups_object = root["damage_groups"];
+ if (damage_groups_object.isObject()) {
+ Json::ValueIterator dgiter;
+ for (dgiter = damage_groups_object.begin();
+ dgiter != damage_groups_object.end(); ++dgiter) {
+ Json::Value &value = *dgiter;
+ if (value.isInt())
+ damageGroups[dgiter.key().asString()] =
+ value.asInt();
+ }