169inline std::unordered_map<std::string, SimpleJson>
parseWeaponsFile(
const std::string& filepath =
"config/common/weapons.json") {
170 std::unordered_map<std::string, SimpleJson> weapons;
172 std::ifstream file(filepath);
173 if (!file.is_open())
return weapons;
175 std::stringstream buffer;
176 buffer << file.rdbuf();
177 std::string content = buffer.str();
180 while (pos < content.size() && std::isspace(content[pos])) pos++;
181 if (pos >= content.size() || content[pos] !=
'{')
return weapons;
184 while (pos < content.size()) {
185 while (pos < content.size() && std::isspace(content[pos])) pos++;
186 if (pos >= content.size() || content[pos] ==
'}')
break;
189 if (content[pos] !=
'"')
break;
191 std::string weaponName;
192 while (pos < content.size() && content[pos] !=
'"') {
193 weaponName += content[pos++];
195 if (pos < content.size()) pos++;
197 while (pos < content.size() && std::isspace(content[pos])) pos++;
198 if (pos >= content.size() || content[pos] !=
':')
break;
201 while (pos < content.size() && std::isspace(content[pos])) pos++;
204 if (content[pos] ==
'{') {
205 size_t objStart = pos;
207 while (pos < content.size()) {
208 if (content[pos] ==
'{') braceCount++;
209 else if (content[pos] ==
'}') {
211 if (braceCount == 0) {
213 std::string weaponContent = content.substr(objStart, pos - objStart);
216 weapons[weaponName] = weaponData;
224 while (pos < content.size() && std::isspace(content[pos])) pos++;
225 if (pos < content.size() && content[pos] ==
',') pos++;