#include "map_setting.h" #include "m2_tokvec.h" #include namespace fmt { bool parse_map_setting(const std::string& text, MapSetting& out, std::string* err) { TokVecMap tv; std::string perr; parse_tokvec(text, tv, &perr); out = MapSetting{}; if (!tv.has("mapsize")) { if (err) *err = "setting.txt 缺 MapSize"; return false; } if (const auto* v = tv.find("mapsize"); v && v->size() >= 2) { out.map_size_x = (int)std::strtol((*v)[0].c_str(), nullptr, 10); out.map_size_y = (int)std::strtol((*v)[1].c_str(), nullptr, 10); } else { if (err) *err = "setting.txt MapSize 需要两个整数"; return false; } if (out.map_size_x <= 0 || out.map_size_y <= 0) { if (err) *err = "setting.txt MapSize 非法"; return false; } if (tv.has("cellscale")) out.cell_scale = (int)tv.inum("cellscale"); if (tv.has("heightscale")) out.height_scale = tv.num("heightscale"); out.view_radius = (int)tv.inum("viewradius", 0); if (const auto* v = tv.find("baseposition"); v && v->size() >= 2) { out.base_position_x = std::strtol((*v)[0].c_str(), nullptr, 10); out.base_position_y = std::strtol((*v)[1].c_str(), nullptr, 10); } out.texture_set = tv.str("textureset"); out.environment = tv.str("environment"); if (out.cell_scale <= 0) { if (err) *err = "setting.txt CellScale 非法"; return false; } return true; } bool parse_map_setting_file(const std::string& path, MapSetting& out, std::string* err) { std::string text; if (!read_file(path, text)) { if (err) *err = "打不开 " + path; return false; } return parse_map_setting(text, out, err); } } // namespace fmt