void AttributeMeta<Option>::Set(SlkSingle& obj) const { if (valid_) { if (meta_->index == uint32_t(-1)) { if (name_ == "auto" && meta_->slk == "UnitAbilities" && value_ == "") { obj[name_] = SlkValue("_", meta_->type == VariableData::OBJTYPE_STRING); } else { obj[name_] = SlkValue(value_, meta_->type == VariableData::OBJTYPE_STRING); } return ; } auto it = obj.find(name_); if (it == obj.end()) { obj[name_] = SlkValue(value_, meta_->type == VariableData::OBJTYPE_STRING); return ; } SlkValue& val = it->second; std::vector<std::string> result; split(result, val.to_string(), char_equal(',')); if (meta_->index >= result.size()) { return ; } result[meta_->index] = value_; val.set(concat(result, ',')); } }
MetaSingle SlkSingleToMetaSingle(SlkSingle const& slkSingle) { MetaSingle val; // type auto TypeIt = slkSingle.find("type"); if (TypeIt == slkSingle.end()) { assert(false); throw base::exception("meta slk file miss 'type'."); } std::string const& TypeStr = TypeIt->second.to_string(); val.type = ConvertVariableDataType(TypeStr); // index auto IndexIt = slkSingle.find("index"); if (IndexIt == slkSingle.end()) { assert(false); throw base::exception("meta slk file miss 'index'."); } val.index = std::stol(IndexIt->second.to_string()); // stringExt auto StringExtIt = slkSingle.find("stringExt"); if (StringExtIt == slkSingle.end()) { assert(false); throw base::exception("meta slk file miss 'stringExt'."); } val.stringExt = std::stol(StringExtIt->second.to_string()); // field auto FieldIt = slkSingle.find("field"); if (FieldIt == slkSingle.end()) { assert(false); throw base::exception("meta slk file miss 'field'."); } if (FieldIt->second.to_string() == "Data") { auto DataIt = slkSingle.find("data"); if (DataIt == slkSingle.end()) { assert(false); throw base::exception("meta slk file miss 'data'."); } std::string const& Data = DataIt->second.to_string(); if (Data.size() <= 0) { assert(false); throw base::exception("meta slk file miss 'data'."); } val.field = "Data"+ std::string(1, static_cast<char>('A'+Data[0]-'0'-1)); } else { val.field = FieldIt->second.to_string(); } // slk val.slk = SlkSingleGetValue(slkSingle, "slk"); return std::move(val); }