diff --git a/Source/Contents/ReputeMgr.cpp b/Source/Contents/ReputeMgr.cpp index 2272873de..ab9a9b809 100644 --- a/Source/Contents/ReputeMgr.cpp +++ b/Source/Contents/ReputeMgr.cpp @@ -15,6 +15,24 @@ #include #include +extern "C" void JsonDestroy(); + +struct JsonValueCopy { + /* 0000 */ JsonValue value; + + // INLINED + JsonValueCopy(const JsonValue& other) { + reinterpret_cast(JsonCopyConstruct)(&this->value, &other); + } + + JsonValueCopy(const JsonValueCopy&) = delete; + + // INLINED + ~JsonValueCopy() { + reinterpret_cast(JsonDestroy)(&this->value); + } +}; + // OFFSET: 0x0050AE30 // FUNCTION: fn_00894 bool JsonCppLoader::GetReputeGroupData(std::map* out) { @@ -38,19 +56,19 @@ bool JsonCppLoader::GetReputeGroupData(std::map* out) { return false; } - const JsonObject* members = groups->ObjectRange(); - const JsonObject none; - for (const JsonMember& member : members ? *members : none) { - const std::string name = member.first; - const JsonValue node = member.second; - ReputeGroupRecord record; - this->GetStringValue(node, "ID", &record.id); - this->GetStringValue(node, "Name", &record.name); - this->GetIntVectorValue(node, "ReputeList", &record.reputes); + if (const JsonObject* members = groups->ObjectRange()) { + for (const JsonMember& member : *members) { + const std::string name = member.first; + const JsonValueCopy node(member.second); + ReputeGroupRecord record; + this->GetStringValue(node.value, "ID", &record.id); + this->GetStringValue(node.value, "Name", &record.name); + this->GetIntVectorValue(node.value, "ReputeList", &record.reputes); - if (!out->insert(std::make_pair(std::stoi(name), record)).second) { - this->Fail("중복키가 입력되었습니다. (name : %s)", name.c_str()); - return false; + if (!out->insert(std::pair(std::stoi(name), record)).second) { + this->Fail("중복키가 입력되었습니다. (name : %s)", name.c_str()); + return false; + } } } @@ -80,20 +98,20 @@ bool JsonCppLoader::GetReputeInfoData(std::map* out) { return false; } - const JsonObject* members = infos->ObjectRange(); - const JsonObject none; - for (const JsonMember& member : members ? *members : none) { - const std::string name = member.first; - const JsonValue node = member.second; - ReputeInfoRecord record; - this->GetStringValue(node, "Name", &record.name); - this->GetIntValue(node, "MaxPoint_Positive", &record.maxPointPositive); - this->GetIntValue(node, "MaxPoint_Negative", &record.maxPointNegative); - this->GetStringValue(node, "Invisible", &record.invisible); + if (const JsonObject* members = infos->ObjectRange()) { + for (const JsonMember& member : *members) { + const std::string name = member.first; + const JsonValueCopy node(member.second); + ReputeInfoRecord record; + this->GetStringValue(node.value, "Name", &record.name); + this->GetIntValue(node.value, "MaxPoint_Positive", &record.maxPointPositive); + this->GetIntValue(node.value, "MaxPoint_Negative", &record.maxPointNegative); + this->GetStringValue(node.value, "Invisible", &record.invisible); - if (!out->insert(std::make_pair(std::stoi(name), record)).second) { - this->Fail("중복키가 입력되었습니다. (key : %s)", name.c_str()); - return false; + if (!out->insert(std::pair(std::stoi(name), record)).second) { + this->Fail("중복키가 입력되었습니다. (key : %s)", name.c_str()); + return false; + } } }