void furn_t::load( JsonObject &jo ) { mandatory( jo, was_loaded, "name", name, translated_string_reader ); mandatory( jo, was_loaded, "move_cost_mod", movecost ); mandatory( jo, was_loaded, "required_str", move_str_req ); optional( jo, was_loaded, "max_volume", max_volume, legacy_volume_reader, DEFAULT_MAX_VOLUME_IN_SQUARE ); optional( jo, was_loaded, "crafting_pseudo_item", crafting_pseudo_item, "" ); load_symbol( jo ); transparent = false; for( auto & flag : jo.get_string_array( "flags" ) ) { set_flag( flag ); } if( jo.has_member( "examine_action" ) ) { examine = iexamine_function_from_string( jo.get_string( "examine_action" ) ); } else { examine = iexamine_function_from_string( "none" ); } optional( jo, was_loaded, "open", open, string_id_reader<furn_t> {}, NULL_ID ); optional( jo, was_loaded, "close", close, string_id_reader<furn_t> {}, NULL_ID ); bash.load( jo, "bash", true ); deconstruct.load( jo, "deconstruct", true ); }
void ter_t::load( JsonObject &jo, const std::string &src ) { map_data_common_t::load( jo, src ); mandatory( jo, was_loaded, "name", name_ ); mandatory( jo, was_loaded, "move_cost", movecost ); optional( jo, was_loaded, "max_volume", max_volume, legacy_volume_reader, DEFAULT_MAX_VOLUME_IN_SQUARE ); optional( jo, was_loaded, "trap", trap_id_str ); load_symbol( jo ); trap = tr_null; transparent = false; connect_group = TERCONN_NONE; for( auto &flag : jo.get_string_array( "flags" ) ) { set_flag( flag ); } // connect_group is initialized to none, then terrain flags are set, then finally // connections from JSON are set. This is so that wall flags can set wall connections // but can be overridden by explicit connections in JSON. if( jo.has_member( "connects_to" ) ) { set_connects( jo.get_string( "connects_to" ) ); } optional( jo, was_loaded, "open", open, ter_str_id::NULL_ID() ); optional( jo, was_loaded, "close", close, ter_str_id::NULL_ID() ); optional( jo, was_loaded, "transforms_into", transforms_into, ter_str_id::NULL_ID() ); optional( jo, was_loaded, "roof", roof, ter_str_id::NULL_ID() ); bash.load( jo, "bash", false ); deconstruct.load( jo, "deconstruct", false ); }
void mutation_branch::load( JsonObject &jsobj ) { const std::string id = jsobj.get_string( "id" ); mutation_branch &new_mut = mutation_data[id]; JsonArray jsarr; new_mut.name = _(jsobj.get_string("name").c_str()); new_mut.description = _(jsobj.get_string("description").c_str()); new_mut.points = jsobj.get_int("points"); new_mut.visibility = jsobj.get_int("visibility", 0); new_mut.ugliness = jsobj.get_int("ugliness", 0); new_mut.startingtrait = jsobj.get_bool("starting_trait", false); new_mut.mixed_effect = jsobj.get_bool("mixed_effect", false); new_mut.activated = jsobj.get_bool("active", false); new_mut.cost = jsobj.get_int("cost", 0); new_mut.cooldown = jsobj.get_int("time",0); new_mut.hunger = jsobj.get_bool("hunger",false); new_mut.thirst = jsobj.get_bool("thirst",false); new_mut.fatigue = jsobj.get_bool("fatigue",false); new_mut.valid = jsobj.get_bool("valid", true); new_mut.purifiable = jsobj.get_bool("purifiable", true); new_mut.initial_ma_styles = jsobj.get_string_array( "initial_ma_styles" ); new_mut.threshold = jsobj.get_bool("threshold", false); new_mut.profession = jsobj.get_bool("profession", false); load_mutation_mods(jsobj, "passive_mods", new_mut.mods); /* Not currently supported due to inability to save active mutation state load_mutation_mods(jsobj, "active_mods", new_mut.mods); */ new_mut.prereqs = jsobj.get_string_array( "prereqs" ); // Helps to be able to have a trait require more than one other trait // (Individual prereq-lists are "OR", not "AND".) // Traits shoud NOT appear in both lists for a given mutation, unless // you want that trait to satisfy both requirements. // These are additional to the first list. new_mut.prereqs2 = jsobj.get_string_array( "prereqs2" ); // Dedicated-purpose prereq slot for Threshold mutations // Stuff like Huge might fit in more than one mutcat post-threshold, so yeah new_mut.threshreq = jsobj.get_string_array( "threshreq" ); new_mut.cancels = jsobj.get_string_array( "cancels" ); new_mut.replacements = jsobj.get_string_array( "changes_to" ); new_mut.additions = jsobj.get_string_array( "leads_to" ); jsarr = jsobj.get_array("category"); while (jsarr.has_more()) { std::string s = jsarr.next_string(); new_mut.category.push_back(s); mutations_category[s].push_back(id); } jsarr = jsobj.get_array("wet_protection"); while (jsarr.has_more()) { JsonObject jo = jsarr.next_object(); std::string part_id = jo.get_string("part"); int ignored = jo.get_int("ignored", 0); int neutral = jo.get_int("neutral", 0); int good = jo.get_int("good", 0); tripoint protect = tripoint(ignored, neutral, good); new_mut.protection[part_id] = mutation_wet(body_parts[part_id], protect); } }
void ter_t::load( JsonObject &jo ) { mandatory( jo, was_loaded, "name", name, translated_string_reader ); mandatory( jo, was_loaded, "move_cost", movecost ); optional( jo, was_loaded, "max_volume", max_volume, MAX_VOLUME_IN_SQUARE ); optional( jo, was_loaded, "trap", trap_id_str ); load_symbol( jo ); trap = tr_null; transparent = false; connect_group = TERCONN_NONE; for( auto &flag : jo.get_string_array( "flags" ) ) { set_flag( flag ); } // connect_group is initialised to none, then terrain flags are set, then finally // connections from JSON are set. This is so that wall flags can set wall connections // but can be overridden by explicit connections in JSON. if( jo.has_member( "connects_to" ) ) { set_connects( jo.get_string( "connects_to" ) ); } if( jo.has_member( "examine_action" ) ) { examine = iexamine_function_from_string( jo.get_string( "examine_action" ) ); } else { examine = iexamine_function_from_string( "none" ); } optional( jo, was_loaded, "harvestable", harvestable ); optional( jo, was_loaded, "open", open, NULL_ID ); optional( jo, was_loaded, "close", close, NULL_ID ); optional( jo, was_loaded, "transforms_into", transforms_into, NULL_ID ); optional( jo, was_loaded, "roof", roof, NULL_ID ); if( jo.has_member("harvest_season") ) { const std::string season = jo.get_string( "harvest_season" ); if( season == "SPRING" ) { harvest_season = season_type::SPRING; } else if( season == "SUMMER" ) { harvest_season = season_type::SUMMER; } else if( season == "AUTUMN" ) { harvest_season = season_type::AUTUMN; } else if( season == "WINTER" ) { harvest_season = season_type::WINTER; } else { harvest_season = season_type::AUTUMN; debugmsg( "Invalid harvest season \"%s\" in \"%s\".", season.c_str(), id.c_str() ); } } bash.load( jo, "bash", false ); deconstruct.load( jo, "deconstruct", false ); }
void load_furniture(JsonObject &jsobj) { if ( furnlist.empty() ) { furn_t new_null = null_furniture_t(); furnmap[new_null.id] = new_null; furnlist.push_back(new_null); } furn_t new_furniture; new_furniture.id = jsobj.get_string("id"); if ( new_furniture.id == "f_null" ) { return; } new_furniture.name = _(jsobj.get_string("name").c_str()); new_furniture.load_symbol( jsobj ); new_furniture.movecost = jsobj.get_int("move_cost_mod"); new_furniture.move_str_req = jsobj.get_int("required_str"); new_furniture.max_volume = jsobj.get_int("max_volume", MAX_VOLUME_IN_SQUARE); new_furniture.crafting_pseudo_item = jsobj.get_string("crafting_pseudo_item", ""); new_furniture.transparent = false; for( auto & flag : jsobj.get_string_array( "flags" ) ) { new_furniture.set_flag( flag ); } if(jsobj.has_member("examine_action")) { std::string function_name = jsobj.get_string("examine_action"); new_furniture.examine = iexamine_function_from_string(function_name); } else { //If not specified, default to no action new_furniture.examine = iexamine_function_from_string("none"); } new_furniture.open = ""; if ( jsobj.has_member("open") ) { new_furniture.open = jsobj.get_string("open"); } new_furniture.close = ""; if ( jsobj.has_member("close") ) { new_furniture.close = jsobj.get_string("close"); } new_furniture.bash.load(jsobj, "bash", true); new_furniture.deconstruct.load(jsobj, "deconstruct", true); new_furniture.loadid = furn_id( furnlist.size() ); furnmap[new_furniture.id] = new_furniture; furnlist.push_back(new_furniture); }
void player_activity::deserialize(JsonIn &jsin) { JsonObject data = jsin.get_object(); int tmptype; int tmpinv; if ( !data.read( "type", tmptype ) || type >= NUM_ACTIVITIES ) { debugmsg( "Bad activity data:\n%s", data.str().c_str() ); } type = activity_type(tmptype); data.read( "moves_left", moves_left ); data.read( "index", index ); data.read( "invlet", tmpinv ); invlet = (char)tmpinv; data.read( "name", name ); data.read( "placement", placement ); values = data.get_int_array("values"); str_values = data.get_string_array("str_values"); }
void player_activity::deserialize(JsonIn &jsin) { JsonObject data = jsin.get_object(); int tmptype; int tmppos; if ( !data.read( "type", tmptype ) || type >= NUM_ACTIVITIES ) { debugmsg( "Bad activity data:\n%s", data.str().c_str() ); } if ( !data.read( "position", tmppos)) { tmppos = INT_MIN; // If loading a save before position existed, hope. } type = activity_type(tmptype); data.read( "moves_left", moves_left ); data.read( "index", index ); position = tmppos; data.read( "name", name ); data.read( "placement", placement ); values = data.get_int_array("values"); str_values = data.get_string_array("str_values"); }
void furn_t::load( JsonObject &jo, const std::string &src ) { map_data_common_t::load( jo, src ); mandatory( jo, was_loaded, "name", name_ ); mandatory( jo, was_loaded, "move_cost_mod", movecost ); mandatory( jo, was_loaded, "required_str", move_str_req ); optional( jo, was_loaded, "max_volume", max_volume, legacy_volume_reader, DEFAULT_MAX_VOLUME_IN_SQUARE ); optional( jo, was_loaded, "crafting_pseudo_item", crafting_pseudo_item, "" ); optional( jo, was_loaded, "deployed_item", deployed_item ); load_symbol( jo ); transparent = false; for( auto & flag : jo.get_string_array( "flags" ) ) { set_flag( flag ); } optional( jo, was_loaded, "open", open, string_id_reader<furn_t> {}, furn_str_id::NULL_ID() ); optional( jo, was_loaded, "close", close, string_id_reader<furn_t> {}, furn_str_id::NULL_ID() ); bash.load( jo, "bash", true ); deconstruct.load( jo, "deconstruct", true ); }
void load_terrain(JsonObject &jsobj) { if ( terlist.empty() ) { ter_t new_null = null_terrain_t(); termap[new_null.id] = new_null; terlist.push_back(new_null); } ter_t new_terrain; new_terrain.id = jsobj.get_string("id"); if ( new_terrain.id == "t_null" ) { return; } new_terrain.name = _(jsobj.get_string("name").c_str()); //Special case for the LINE_ symbols std::string symbol = jsobj.get_string("symbol"); if("LINE_XOXO" == symbol) { new_terrain.sym = LINE_XOXO; } else if("LINE_OXOX" == symbol) { new_terrain.sym = LINE_OXOX; } else { new_terrain.sym = symbol.c_str()[0]; } new_terrain.color = color_from_string(jsobj.get_string("color")); new_terrain.movecost = jsobj.get_int("move_cost"); if(jsobj.has_member("trap")) { // Store the string representation of the trap id. // Overwrites the trap field in set_trap_ids() once ids are assigned.. new_terrain.trap_id_str = jsobj.get_string("trap"); } new_terrain.trap = tr_null; new_terrain.max_volume = jsobj.get_int("max_volume", MAX_VOLUME_IN_SQUARE); new_terrain.transparent = false; for( auto & flag : jsobj.get_string_array( "flags" ) ) { new_terrain.set_flag( flag ); } if(jsobj.has_member("examine_action")) { std::string function_name = jsobj.get_string("examine_action"); new_terrain.examine = iexamine_function_from_string(function_name); } else { // if not specified, default to no action new_terrain.examine = iexamine_function_from_string("none"); } // if the terrain has something harvestable if (jsobj.has_member("harvestable")) { new_terrain.harvestable = jsobj.get_string("harvestable"); // get the harvestable } if (jsobj.has_member("transforms_into")) { new_terrain.transforms_into = jsobj.get_string("transforms_into"); // get the terrain to transform into later on } if (jsobj.has_member("harvest_season")) { //get the harvest season if (jsobj.get_string("harvest_season") == "SPRING") {new_terrain.harvest_season = 0;} // convert the season to int for calendar compare else if (jsobj.get_string("harvest_season") == "SUMMER") {new_terrain.harvest_season = 1;} else if (jsobj.get_string("harvest_season") == "AUTUMN") {new_terrain.harvest_season = 2;} else {new_terrain.harvest_season = 3;} } new_terrain.open = ""; if ( jsobj.has_member("open") ) { new_terrain.open = jsobj.get_string("open"); } new_terrain.close = ""; if ( jsobj.has_member("close") ) { new_terrain.close = jsobj.get_string("close"); } new_terrain.bash.load(jsobj, "bash", false); new_terrain.deconstruct.load(jsobj, "deconstruct", false); new_terrain.loadid=terlist.size(); termap[new_terrain.id]=new_terrain; terlist.push_back(new_terrain); }
void load_furniture(JsonObject &jsobj) { if ( furnlist.empty() ) { furn_t new_null = null_furniture_t(); furnmap[new_null.id] = new_null; furnlist.push_back(new_null); } furn_t new_furniture; new_furniture.id = jsobj.get_string("id"); if ( new_furniture.id == "f_null" ) { return; } new_furniture.name = _(jsobj.get_string("name").c_str()); new_furniture.sym = jsobj.get_string("symbol").c_str()[0]; bool has_color = jsobj.has_member("color"); bool has_bgcolor = jsobj.has_member("bgcolor"); if(has_color && has_bgcolor) { debugmsg("Found both color and bgcolor for %s, use only one of these.", new_furniture.name.c_str()); new_furniture.color = c_white; } else if(has_color) { new_furniture.color = color_from_string(jsobj.get_string("color")); } else if(has_bgcolor) { new_furniture.color = bgcolor_from_string(jsobj.get_string("bgcolor")); } else { debugmsg("Furniture %s needs at least one of: color, bgcolor.", new_furniture.name.c_str()); } new_furniture.movecost = jsobj.get_int("move_cost_mod"); new_furniture.move_str_req = jsobj.get_int("required_str"); new_furniture.max_volume = jsobj.get_int("max_volume", MAX_VOLUME_IN_SQUARE); new_furniture.crafting_pseudo_item = jsobj.get_string("crafting_pseudo_item", ""); new_furniture.transparent = false; for( auto & flag : jsobj.get_string_array( "flags" ) ) { new_furniture.set_flag( flag ); } if(jsobj.has_member("examine_action")) { std::string function_name = jsobj.get_string("examine_action"); new_furniture.examine = iexamine_function_from_string(function_name); } else { //If not specified, default to no action new_furniture.examine = iexamine_function_from_string("none"); } new_furniture.open = ""; if ( jsobj.has_member("open") ) { new_furniture.open = jsobj.get_string("open"); } new_furniture.close = ""; if ( jsobj.has_member("close") ) { new_furniture.close = jsobj.get_string("close"); } new_furniture.bash.load(jsobj, "bash", true); new_furniture.deconstruct.load(jsobj, "deconstruct", true); new_furniture.loadid = furnlist.size(); furnmap[new_furniture.id] = new_furniture; furnlist.push_back(new_furniture); }
void mod_manager::load_modfile(JsonObject &jo, const std::string &main_path) { if (!jo.has_string("type") || jo.get_string("type") != "MOD_INFO") { // Ignore anything that is not a mod-info return; } std::string m_ident = jo.get_string("ident"); if (has_mod(m_ident)) { // TODO: change this to make unique ident for the mod // (instead of discarding it?) debugmsg("there is already a mod with ident %s", m_ident.c_str()); return; } if( jo.has_bool( "obsolete" ) ) { // Marked obsolete, no need to try to load anything else. MOD_INFORMATION *modfile = new MOD_INFORMATION; modfile->ident = m_ident; modfile->obsolete = true; mod_map[modfile->ident] = modfile; return; } std::string t_type = jo.get_string("mod-type", "SUPPLEMENTAL"); std::vector<std::string> m_authors; if (jo.has_array("authors")) { m_authors = jo.get_string_array("authors"); } else { if(jo.has_string("author")) { m_authors.push_back(jo.get_string("author")); } } std::string m_name = jo.get_string("name", ""); if (m_name.empty()) { // "No name" gets confusing if many mods have no name //~ name of a mod that has no name entry, (%s is the mods identifier) m_name = string_format(_("No name (%s)"), m_ident.c_str()); } else { m_name = _(m_name.c_str()); } std::string m_desc = jo.get_string("description", ""); if (m_desc.empty()) { m_desc = _("No description"); } else { m_desc = _(m_desc.c_str()); } std::string m_path; if (jo.has_string("path")) { m_path = jo.get_string("path"); if (m_path.empty()) { // If an empty path is given, use only the // folder of the modinfo.json m_path = main_path; } else { // prefix the folder of modinfo.json m_path = main_path + "/" + m_path; } } else { // Default if no path is given: // "<folder-of-modinfo.json>/data" m_path = main_path + "/data"; } std::vector<std::string> m_dependencies; if (jo.has_member("dependencies") && jo.has_array("dependencies")) { JsonArray jarr = jo.get_array("dependencies"); while(jarr.has_more()) { const std::string dep = jarr.next_string(); if (dep == m_ident) { debugmsg("mod %s has itself as dependency", m_ident.c_str()); continue; } if (std::find(m_dependencies.begin(), m_dependencies.end(), dep) != m_dependencies.end()) { // Some dependency listed twice, ignore it, what else can be done? continue; } m_dependencies.push_back(dep); } } mod_type m_type; if (t_type == "CORE") { m_type = MT_CORE; } else if (t_type == "SUPPLEMENTAL") { m_type = MT_SUPPLEMENTAL; } else { throw std::string("Invalid mod type: ") + t_type + " for mod " + m_ident; } MOD_INFORMATION *modfile = new MOD_INFORMATION; modfile->ident = m_ident; modfile->_type = m_type; modfile->authors = m_authors; modfile->name = m_name; modfile->description = m_desc; modfile->dependencies = m_dependencies; modfile->path = m_path; mod_map[modfile->ident] = modfile; }
void mutation_branch::load( JsonObject &jsobj ) { const std::string id = jsobj.get_string( "id" ); mutation_branch &new_mut = mutation_data[id]; JsonArray jsarr; new_mut.name = _(jsobj.get_string("name").c_str()); new_mut.description = _(jsobj.get_string("description").c_str()); new_mut.points = jsobj.get_int("points"); new_mut.visibility = jsobj.get_int("visibility", 0); new_mut.ugliness = jsobj.get_int("ugliness", 0); new_mut.startingtrait = jsobj.get_bool("starting_trait", false); new_mut.mixed_effect = jsobj.get_bool("mixed_effect", false); new_mut.activated = jsobj.get_bool("active", false); new_mut.starts_active = jsobj.get_bool("starts_active", false); new_mut.destroys_gear = jsobj.get_bool("destroys_gear", false); new_mut.allow_soft_gear = jsobj.get_bool("allow_soft_gear", false); new_mut.cost = jsobj.get_int("cost", 0); new_mut.cooldown = jsobj.get_int("time",0); new_mut.hunger = jsobj.get_bool("hunger",false); new_mut.thirst = jsobj.get_bool("thirst",false); new_mut.fatigue = jsobj.get_bool("fatigue",false); new_mut.valid = jsobj.get_bool("valid", true); new_mut.purifiable = jsobj.get_bool("purifiable", true); for( auto & s : jsobj.get_string_array( "initial_ma_styles" ) ) { new_mut.initial_ma_styles.push_back( matype_id( s ) ); } JsonArray bodytemp_array = jsobj.get_array( "bodytemp_modifiers" ); if( bodytemp_array.has_more() ) { new_mut.bodytemp_min = bodytemp_array.get_int( 0 ); new_mut.bodytemp_max = bodytemp_array.get_int( 1 ); } new_mut.bodytemp_sleep = jsobj.get_int( "bodytemp_sleep", 0 ); new_mut.threshold = jsobj.get_bool("threshold", false); new_mut.profession = jsobj.get_bool("profession", false); auto vr = jsobj.get_array( "vitamin_rates" ); while( vr.has_more() ) { auto pair = vr.next_array(); new_mut.vitamin_rates[ vitamin_id( pair.get_string( 0 ) ) ] = pair.get_int( 1 ); } load_mutation_mods(jsobj, "passive_mods", new_mut.mods); /* Not currently supported due to inability to save active mutation state load_mutation_mods(jsobj, "active_mods", new_mut.mods); */ new_mut.prereqs = jsobj.get_string_array( "prereqs" ); // Helps to be able to have a trait require more than one other trait // (Individual prereq-lists are "OR", not "AND".) // Traits shoud NOT appear in both lists for a given mutation, unless // you want that trait to satisfy both requirements. // These are additional to the first list. new_mut.prereqs2 = jsobj.get_string_array( "prereqs2" ); // Dedicated-purpose prereq slot for Threshold mutations // Stuff like Huge might fit in more than one mutcat post-threshold, so yeah new_mut.threshreq = jsobj.get_string_array( "threshreq" ); new_mut.cancels = jsobj.get_string_array( "cancels" ); new_mut.replacements = jsobj.get_string_array( "changes_to" ); new_mut.additions = jsobj.get_string_array( "leads_to" ); new_mut.flags = jsobj.get_tags( "flags" ); jsarr = jsobj.get_array("category"); while (jsarr.has_more()) { std::string s = jsarr.next_string(); new_mut.category.push_back(s); mutations_category[s].push_back(id); } jsarr = jsobj.get_array("wet_protection"); while (jsarr.has_more()) { JsonObject jo = jsarr.next_object(); std::string part_id = jo.get_string("part"); int ignored = jo.get_int("ignored", 0); int neutral = jo.get_int("neutral", 0); int good = jo.get_int("good", 0); tripoint protect = tripoint(ignored, neutral, good); new_mut.protection[get_body_part_token( part_id )] = protect; } jsarr = jsobj.get_array("encumbrance_always"); while (jsarr.has_more()) { JsonArray jo = jsarr.next_array(); std::string part_id = jo.next_string(); int enc = jo.next_int(); new_mut.encumbrance_always[get_body_part_token( part_id )] = enc; } jsarr = jsobj.get_array("encumbrance_covered"); while (jsarr.has_more()) { JsonArray jo = jsarr.next_array(); std::string part_id = jo.next_string(); int enc = jo.next_int(); new_mut.encumbrance_covered[get_body_part_token( part_id )] = enc; } jsarr = jsobj.get_array("restricts_gear"); while( jsarr.has_more() ) { new_mut.restricts_gear.insert( get_body_part_token( jsarr.next_string() ) ); } jsarr = jsobj.get_array( "armor" ); while( jsarr.has_more() ) { JsonObject jo = jsarr.next_object(); auto parts = jo.get_tags( "parts" ); std::set<body_part> bps; for( const std::string &part_string : parts ) { if( part_string == "ALL" ) { // Shorthand, since many muts protect whole body for( size_t i = 0; i < num_bp; i++ ) { bps.insert( static_cast<body_part>( i ) ); } } else { bps.insert( get_body_part_token( part_string ) ); } } resistances res = load_resistances_instance( jo ); for( body_part bp : bps ) { new_mut.armor[ bp ] = res; } } }
void load_terrain(JsonObject &jsobj) { if ( terlist.empty() ) { ter_t new_null = null_terrain_t(); termap[new_null.id] = new_null; terlist.push_back(new_null); } ter_t new_terrain; new_terrain.id = jsobj.get_string("id"); if ( new_terrain.id == "t_null" ) { return; } new_terrain.name = _(jsobj.get_string("name").c_str()); new_terrain.load_symbol( jsobj ); new_terrain.movecost = jsobj.get_int("move_cost"); if(jsobj.has_member("trap")) { // Store the string representation of the trap id. // Overwrites the trap field in set_trap_ids() once ids are assigned.. new_terrain.trap_id_str = jsobj.get_string("trap"); } new_terrain.trap = tr_null; new_terrain.max_volume = jsobj.get_int("max_volume", MAX_VOLUME_IN_SQUARE); new_terrain.transparent = false; new_terrain.connect_group = TERCONN_NONE; for( auto & flag : jsobj.get_string_array( "flags" ) ) { new_terrain.set_flag( flag ); } // connect_group is initialised to none, then terrain flags are set, then finally // connections from JSON are set. This is so that wall flags can set wall connections // but can be overridden by explicit connections in JSON. if(jsobj.has_member("connects_to")) { new_terrain.set_connects( jsobj.get_string("connects_to") ); } if(jsobj.has_member("examine_action")) { std::string function_name = jsobj.get_string("examine_action"); new_terrain.examine = iexamine_function_from_string(function_name); } else { // if not specified, default to no action new_terrain.examine = iexamine_function_from_string("none"); } // if the terrain has something harvestable if (jsobj.has_member("harvestable")) { new_terrain.harvestable = jsobj.get_string("harvestable"); // get the harvestable } if (jsobj.has_member("transforms_into")) { new_terrain.transforms_into = jsobj.get_string("transforms_into"); // get the terrain to transform into later on } if (jsobj.has_member("roof")) { new_terrain.roof = jsobj.get_string("roof"); // Get the terrain to create above this one if there would be open air otherwise } if (jsobj.has_member("harvest_season")) { //get the harvest season if (jsobj.get_string("harvest_season") == "SPRING") {new_terrain.harvest_season = 0;} // convert the season to int for calendar compare else if (jsobj.get_string("harvest_season") == "SUMMER") {new_terrain.harvest_season = 1;} else if (jsobj.get_string("harvest_season") == "AUTUMN") {new_terrain.harvest_season = 2;} else {new_terrain.harvest_season = 3;} } new_terrain.open = ""; if ( jsobj.has_member("open") ) { new_terrain.open = jsobj.get_string("open"); } new_terrain.close = ""; if ( jsobj.has_member("close") ) { new_terrain.close = jsobj.get_string("close"); } new_terrain.bash.load(jsobj, "bash", false); new_terrain.deconstruct.load(jsobj, "deconstruct", false); new_terrain.loadid = ter_id( terlist.size() ); termap[new_terrain.id]=new_terrain; terlist.push_back(new_terrain); }
void mod_manager::load_modfile(JsonObject &jo, const std::string &main_path) { if (!jo.has_string("type") || jo.get_string("type") != "MOD_INFO") { // Ignore anything that is not a mod-info return; } std::string m_ident = jo.get_string("ident"); if (has_mod(m_ident)) { // TODO: change this to make unique ident for the mod // (instead of discarding it?) debugmsg("there is already a mod with ident %s", m_ident.c_str()); return; } std::string t_type = jo.get_string("mod-type", "SUPPLEMENTAL"); std::vector<std::string> m_authors; if (jo.has_array("authors")) { m_authors = jo.get_string_array("authors"); } else { if(jo.has_string("author")) { m_authors.push_back(jo.get_string("author")); } } std::string m_name = jo.get_string("name", ""); if (m_name.empty()) { // "No name" gets confusing if many mods have no name //~ name of a mod that has no name entry, (%s is the mods identifier) m_name = string_format(_("No name (%s)"), m_ident.c_str()); } else { m_name = _(m_name.c_str()); } std::string m_desc = jo.get_string("description", ""); if (m_desc.empty()) { m_desc = _("No description"); } else { m_desc = _(m_desc.c_str()); } std::string m_cat = jo.get_string("category", ""); std::pair<int, std::string> p_cat = {-1, ""}; bool bCatFound = false; do { for( size_t i = 0; i < get_mod_list_categories().size(); ++i ) { if( get_mod_list_categories()[i].first == m_cat ) { p_cat = { i, get_mod_list_categories()[i].second }; bCatFound = true; break; } } if( !bCatFound && m_cat != "" ) { m_cat = ""; } else { break; } } while( !bCatFound ); std::string m_path; if (jo.has_string("path")) { m_path = jo.get_string("path"); if (m_path.empty()) { // If an empty path is given, use only the // folder of the modinfo.json m_path = main_path; } else { // prefix the folder of modinfo.json m_path = main_path + "/" + m_path; } } else { // Default if no path is given: // "<folder-of-modinfo.json>/data" m_path = main_path + "/data"; } bool m_need_lua = jo.get_bool("with-lua", false); if ( file_exist(m_path + "/main.lua") || file_exist(m_path + "/preload.lua") ) { m_need_lua = true; } std::vector<std::string> m_dependencies; if (jo.has_member("dependencies") && jo.has_array("dependencies")) { JsonArray jarr = jo.get_array("dependencies"); while(jarr.has_more()) { const std::string dep = jarr.next_string(); if (dep == m_ident) { debugmsg("mod %s has itself as dependency", m_ident.c_str()); continue; } if (std::find(m_dependencies.begin(), m_dependencies.end(), dep) != m_dependencies.end()) { // Some dependency listed twice, ignore it, what else can be done? continue; } m_dependencies.push_back(dep); } } mod_type m_type = MT_CORE; if (t_type == "CORE") { m_type = MT_CORE; } else if (t_type == "SUPPLEMENTAL") { m_type = MT_SUPPLEMENTAL; } else { jo.throw_error( std::string("Invalid mod type: ") + t_type + " for mod " + m_ident ); } MOD_INFORMATION *modfile = new MOD_INFORMATION; modfile->ident = m_ident; modfile->_type = m_type; modfile->authors = m_authors; modfile->name = m_name; modfile->description = m_desc; modfile->dependencies = m_dependencies; modfile->category = p_cat; modfile->path = m_path; modfile->need_lua = m_need_lua; mod_map[modfile->ident] = modfile; }