本文整理汇总了C++中JsonArray::has_more方法的典型用法代码示例。如果您正苦于以下问题:C++ JsonArray::has_more方法的具体用法?C++ JsonArray::has_more怎么用?C++ JsonArray::has_more使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类JsonArray
的用法示例。
在下文中一共展示了JsonArray::has_more方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: load
/**
* Reads in a vehicle part from a JsonObject.
*/
void vpart_info::load( JsonObject &jo )
{
vpart_info next_part;
next_part.id = vpart_str_id( jo.get_string( "id" ) );
next_part.name = _(jo.get_string("name").c_str());
next_part.sym = jo.get_string("symbol")[0];
next_part.color = color_from_string(jo.get_string("color"));
next_part.sym_broken = jo.get_string("broken_symbol")[0];
next_part.color_broken = color_from_string(jo.get_string("broken_color"));
next_part.dmg_mod = jo.has_member("damage_modifier") ? jo.get_int("damage_modifier") : 100;
next_part.durability = jo.get_int("durability");
next_part.power = jo.get_int("power", 0);
next_part.epower = jo.get_int("epower", 0);
next_part.folded_volume = jo.get_int("folded_volume", 0);
next_part.range = jo.get_int( "range", 12 );
next_part.size = jo.get_int( "size", 0 );
//Handle the par1 union as best we can by accepting any ONE of its elements
int element_count = (jo.has_member("par1") ? 1 : 0)
+ (jo.has_member("wheel_width") ? 1 : 0)
+ (jo.has_member("bonus") ? 1 : 0);
if(element_count == 0) {
//If not specified, assume 0
next_part.par1 = 0;
} else if(element_count == 1) {
if(jo.has_member("par1")) {
next_part.par1 = jo.get_int("par1");
} else if(jo.has_member("wheel_width")) {
next_part.par1 = jo.get_int("wheel_width");
} else { //bonus
next_part.par1 = jo.get_int("bonus");
}
} else {
//Too many
debugmsg("Error parsing vehicle part '%s': \
Use AT MOST one of: par1, wheel_width, bonus",
next_part.name.c_str());
//Keep going to produce more messages if other parts are wrong
next_part.par1 = 0;
}
next_part.fuel_type = jo.get_string( "fuel_type", "null" );
next_part.item = jo.get_string("item");
next_part.difficulty = jo.get_int("difficulty");
next_part.location = jo.has_member("location") ? jo.get_string("location") : "";
JsonArray jarr = jo.get_array("flags");
while (jarr.has_more()) {
next_part.set_flag( jarr.next_string() );
}
if( jo.has_member( "breaks_into" ) ) {
JsonIn& stream = *jo.get_raw( "breaks_into" );
next_part.breaks_into_group = item_group::load_item_group( stream, "collection" );
} else {
next_part.breaks_into_group = "EMPTY_GROUP";
}
//Calculate and cache z-ordering based off of location
// list_order is used when inspecting the vehicle
if(next_part.location == "on_roof") {
next_part.z_order = 9;
next_part.list_order = 3;
} else if(next_part.location == "on_cargo") {
next_part.z_order = 8;
next_part.list_order = 6;
} else if(next_part.location == "center") {
next_part.z_order = 7;
next_part.list_order = 7;
} else if(next_part.location == "under") {
//Have wheels show up over frames
next_part.z_order = 6;
next_part.list_order = 10;
} else if(next_part.location == "structure") {
next_part.z_order = 5;
next_part.list_order = 1;
} else if(next_part.location == "engine_block") {
//Should be hidden by frames
next_part.z_order = 4;
next_part.list_order = 8 ;
} else if (next_part.location == "on_battery_mount"){
//Should be hidden by frames
next_part.z_order = 3;
next_part.list_order = 10;
} else if(next_part.location == "fuel_source") {
//Should be hidden by frames
next_part.z_order = 3;
next_part.list_order = 9;
} else if(next_part.location == "roof") {
//Shouldn't be displayed
next_part.z_order = -1;
next_part.list_order = 4;
} else if(next_part.location == "armor") {
//Shouldn't be displayed (the color is used, but not the symbol)
next_part.z_order = -2;
next_part.list_order = 2;
//.........这里部分代码省略.........
示例2: deserialize
void it_artifact_tool::deserialize(JsonObject &jo)
{
id = jo.get_string("id");
name = jo.get_string("name");
description = jo.get_string("description");
sym = jo.get_int("sym");
color = int_to_color(jo.get_int("color"));
price = jo.get_int("price");
// LEGACY: Since it seems artifacts get serialized out to disk, and they're
// dynamic, we need to allow for them to be read from disk for, oh, I guess
// quite some time. Loading and saving once will write things out as a JSON
// array.
if (jo.has_string("m1")) {
materials.push_back(jo.get_string("m1"));
}
if (jo.has_string("m2")) {
materials.push_back(jo.get_string("m2"));
}
// Assumption, perhaps dangerous, that we won't wind up with m1 and m2 and
// a materials array in our serialized objects at the same time.
if (jo.has_array("materials")) {
JsonArray jarr = jo.get_array("materials");
for (int i = 0; i < jarr.size(); ++i) {
materials.push_back(jarr.get_string(i));
}
}
volume = jo.get_int("volume");
weight = jo.get_int("weight");
melee_dam = jo.get_int("melee_dam");
melee_cut = jo.get_int("melee_cut");
m_to_hit = jo.get_int("m_to_hit");
item_tags = jo.get_tags("item_flags");
max_charges = jo.get_long("max_charges");
def_charges = jo.get_long("def_charges");
std::vector<int> rand_charges;
JsonArray jarr = jo.get_array("rand_charges");
while (jarr.has_more()) {
rand_charges.push_back(jarr.next_long());
}
charges_per_use = jo.get_int("charges_per_use");
turns_per_charge = jo.get_int("turns_per_charge");
ammo = jo.get_string("ammo");
revert_to = jo.get_string("revert_to");
charge_type = (art_charge)jo.get_int("charge_type");
JsonArray ja = jo.get_array("effects_wielded");
while (ja.has_more()) {
effects_wielded.push_back((art_effect_passive)ja.next_int());
}
ja = jo.get_array("effects_activated");
while (ja.has_more()) {
effects_activated.push_back((art_effect_active)ja.next_int());
}
ja = jo.get_array("effects_carried");
while (ja.has_more()) {
effects_carried.push_back((art_effect_passive)ja.next_int());
}
if( item_tags.count( "CHOP" ) > 0 ) {
item_tags.insert( "SHEATH_SWORD" );
}
if( item_tags.count( "STAB" ) > 0 ) {
item_tags.insert( "SHEATH_KNIFE" );
}
}
示例3: load_vehiclepart
/**
* Reads in a vehicle part from a JsonObject.
*/
void game::load_vehiclepart(JsonObject &jo)
{
vpart_info next_part;
next_part.id = jo.get_string("id");
next_part.name = _(jo.get_string("name").c_str());
next_part.sym = jo.get_string("symbol")[0];
next_part.color = color_from_string(jo.get_string("color"));
next_part.sym_broken = jo.get_string("broken_symbol")[0];
next_part.color_broken = color_from_string(jo.get_string("broken_color"));
next_part.dmg_mod = jo.has_member("damage_modifier") ? jo.get_int("damage_modifier") : 100;
next_part.durability = jo.get_int("durability");
next_part.power = jo.get_int("power", 0);
next_part.epower = jo.get_int("epower", 0);
next_part.folded_volume = jo.get_int("folded_volume", 0);
next_part.range = jo.get_int( "range", 12 );
//Handle the par1 union as best we can by accepting any ONE of its elements
int element_count = (jo.has_member("par1") ? 1 : 0)
+ (jo.has_member("size") ? 1 : 0)
+ (jo.has_member("wheel_width") ? 1 : 0)
+ (jo.has_member("bonus") ? 1 : 0);
if(element_count == 0) {
//If not specified, assume 0
next_part.par1 = 0;
} else if(element_count == 1) {
if(jo.has_member("par1")) {
next_part.par1 = jo.get_int("par1");
} else if(jo.has_member("size")) {
next_part.par1 = jo.get_int("size");
} else if(jo.has_member("wheel_width")) {
next_part.par1 = jo.get_int("wheel_width");
} else { //bonus
next_part.par1 = jo.get_int("bonus");
}
} else {
//Too many
debugmsg("Error parsing vehicle part '%s': \
Use AT MOST one of: par1, power, size, wheel_width, bonus",
next_part.name.c_str());
//Keep going to produce more messages if other parts are wrong
next_part.par1 = 0;
}
next_part.fuel_type = jo.has_member("fuel_type") ? jo.get_string("fuel_type") : "NULL";
next_part.item = jo.get_string("item");
next_part.difficulty = jo.get_int("difficulty");
next_part.location = jo.has_member("location") ? jo.get_string("location") : "";
next_part.bitflags = 0;
JsonArray jarr = jo.get_array("flags");
std::string nstring = "";
while (jarr.has_more()) {
nstring = jarr.next_string();
next_part.flags.insert(nstring);
if ( vpart_bitflag_map.find(nstring) != vpart_bitflag_map.end() ) {
next_part.bitflags |= mfb( vpart_bitflag_map.find(nstring)->second );
}
}
if (jo.has_member("FOLDABLE") && next_part.folded_volume == 0){
debugmsg("Error: folded part %s has a volume of 0!", next_part.name.c_str());
}
JsonArray breaks_into = jo.get_array("breaks_into");
while(breaks_into.has_more()) {
JsonObject next_entry = breaks_into.next_object();
break_entry next_break_entry;
next_break_entry.item_id = next_entry.get_string("item");
next_break_entry.min = next_entry.get_int("min");
next_break_entry.max = next_entry.get_int("max");
//Sanity check
if(next_break_entry.max < next_break_entry.min) {
debugmsg("For vehicle part %s: breaks_into item '%s' has min (%d) > max (%d)!",
next_part.name.c_str(), next_break_entry.item_id.c_str(),
next_break_entry.min, next_break_entry.max);
}
next_part.breaks_into.push_back(next_break_entry);
}
//Calculate and cache z-ordering based off of location
// list_order is used when inspecting the vehicle
if(next_part.location == "on_roof") {
next_part.z_order = 9;
next_part.list_order = 3;
} else if(next_part.location == "on_cargo") {
next_part.z_order = 8;
next_part.list_order = 6;
} else if(next_part.location == "center") {
next_part.z_order = 7;
next_part.list_order = 7;
} else if(next_part.location == "under") {
//Have wheels show up over frames
next_part.z_order = 6;
next_part.list_order = 10;
} else if(next_part.location == "structure") {
next_part.z_order = 5;
//.........这里部分代码省略.........
示例4: load_construction
void load_construction(JsonObject &jo)
{
construction *con = new construction;
JsonArray temp;
con->description = _(jo.get_string("description").c_str());
con->skill = _(jo.get_string("skill", "carpentry").c_str());
con->difficulty = jo.get_int("difficulty");
con->time = jo.get_int("time");
temp = jo.get_array("tools");
while (temp.has_more()) {
std::vector<component> tool_choices;
JsonArray ja = temp.next_array();
while (ja.has_more()) {
std::string name = ja.next_string();
tool_choices.push_back(component(name, 1));
}
con->tools.push_back(tool_choices);
}
temp = jo.get_array("components");
while (temp.has_more()) {
std::vector<component> comp_choices;
JsonArray ja = temp.next_array();
while (ja.has_more()) {
JsonArray comp = ja.next_array();
std::string name = comp.get_string(0);
int quant = comp.get_int(1);
comp_choices.push_back(component(name, quant));
}
con->components.push_back(comp_choices);
}
con->pre_terrain = jo.get_string("pre_terrain", "");
if (con->pre_terrain.size() > 1
&& con->pre_terrain[0] == 'f'
&& con->pre_terrain[1] == '_') {
con->pre_is_furniture = true;
} else {
con->pre_is_furniture = false;
}
con->post_terrain = jo.get_string("post_terrain", "");
if (con->post_terrain.size() > 1
&& con->post_terrain[0] == 'f'
&& con->post_terrain[1] == '_') {
con->post_is_furniture = true;
} else {
con->post_is_furniture = false;
}
con->pre_flags = jo.get_tags("pre_flags");
std::string prefunc = jo.get_string("pre_special", "");
if (prefunc == "check_empty") {
con->pre_special = &construct::check_empty;
} else if (prefunc == "check_support") {
con->pre_special = &construct::check_support;
} else {
// should probably print warning if not ""
con->pre_special = &construct::check_nothing;
}
std::string postfunc = jo.get_string("post_special", "");
if (postfunc == "done_tree") {
con->post_special = &construct::done_tree;
} else if (postfunc == "done_trunk_log") {
con->post_special = &construct::done_trunk_log;
} else if (postfunc == "done_trunk_plank") {
con->post_special = &construct::done_trunk_plank;
} else if (postfunc == "done_vehicle") {
con->post_special = &construct::done_vehicle;
} else if (postfunc == "done_deconstruct") {
con->post_special = &construct::done_deconstruct;
} else {
// ditto, should probably warn here
con->post_special = &construct::done_nothing;
}
con->id = constructions.size();
constructions.push_back(con);
}
示例5: load_modfile
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_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;
}
示例6: load_furniture
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;
new_furniture.bitflags = 0;
JsonArray flags = jsobj.get_array("flags");
while(flags.has_more()) {
new_furniture.set_flag(flags.next_string());
}
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);
}
示例7: load
void mtype::load( JsonObject &jo )
{
MonsterGenerator &gen = MonsterGenerator::generator();
// Name and name plural are not translated here, but when needed in
// combination with the actual count in `mtype::nname`.
mandatory( jo, was_loaded, "name", name );
// default behaviour: Assume the regular plural form (appending an “s”)
optional( jo, was_loaded, "name_plural", name_plural, name + "s" );
mandatory( jo, was_loaded, "description", description, translated_string_reader );
// Have to overwrite the default { "hflesh" } here
if( !was_loaded || jo.has_member( "material" ) ) {
mat = { jo.get_string( "material" ) };
}
optional( jo, was_loaded, "species", species, auto_flags_reader<species_id> {} );
optional( jo, was_loaded, "categories", categories, auto_flags_reader<> {} );
// See monfaction.cpp
if( !was_loaded || jo.has_member( "default_faction" ) ) {
const auto faction = mfaction_str_id( jo.get_string( "default_faction" ) );
default_faction = monfactions::get_or_add_faction( faction );
}
if( !was_loaded || jo.has_member( "symbol" ) ) {
sym = jo.get_string( "symbol" );
if( utf8_wrapper( sym ).display_width() != 1 ) {
jo.throw_error( "monster symbol should be exactly one console cell width", "symbol" );
}
}
mandatory( jo, was_loaded, "color", color, color_reader{} );
const typed_flag_reader<decltype( Creature::size_map )> size_reader{ Creature::size_map, "invalid creature size" };
optional( jo, was_loaded, "size", size, size_reader, MS_MEDIUM );
const typed_flag_reader<decltype( gen.phase_map )> phase_reader{ gen.phase_map, "invalid phase id" };
optional( jo, was_loaded, "phase", phase, phase_reader, SOLID );
optional( jo, was_loaded, "diff", difficulty, 0 );
optional( jo, was_loaded, "aggression", agro, 0 );
optional( jo, was_loaded, "morale", morale, 0 );
optional( jo, was_loaded, "speed", speed, 0 );
optional( jo, was_loaded, "attack_cost", attack_cost, 100 );
optional( jo, was_loaded, "melee_skill", melee_skill, 0 );
optional( jo, was_loaded, "melee_dice", melee_dice, 0 );
optional( jo, was_loaded, "melee_dice_sides", melee_sides, 0 );
optional( jo, was_loaded, "dodge", sk_dodge, 0 );
optional( jo, was_loaded, "armor_bash", armor_bash, 0 );
optional( jo, was_loaded, "armor_cut", armor_cut, 0 );
optional( jo, was_loaded, "armor_acid", armor_acid, armor_cut / 2 );
optional( jo, was_loaded, "armor_fire", armor_fire, 0 );
optional( jo, was_loaded, "hp", hp, 0 );
optional( jo, was_loaded, "starting_ammo", starting_ammo );
optional( jo, was_loaded, "luminance", luminance, 0 );
optional( jo, was_loaded, "revert_to_itype", revert_to_itype, "" );
optional( jo, was_loaded, "vision_day", vision_day, 40 );
optional( jo, was_loaded, "vision_night", vision_night, 1 );
optional( jo, was_loaded, "armor_stab", armor_stab, 0.8f * armor_cut );
optional( jo, was_loaded, "attack_effs", atk_effs, mon_attack_effect_reader{} );
// TODO: make this work with `was_loaded`
if( jo.has_array( "melee_damage" ) ) {
JsonArray arr = jo.get_array( "melee_damage" );
melee_damage = load_damage_instance( arr );
} else if( jo.has_object( "melee_damage" ) ) {
melee_damage = load_damage_instance( jo );
}
if( jo.has_int( "melee_cut" ) ) {
int bonus_cut = jo.get_int( "melee_cut" );
melee_damage.add_damage( DT_CUT, bonus_cut );
}
// TODO: allow adding/removing specific entries if `was_loaded` is true
if( jo.has_array( "attack_effs" ) ) {
JsonArray jsarr = jo.get_array( "attack_effs" );
while( jsarr.has_more() ) {
JsonObject e = jsarr.next_object();
mon_effect_data new_eff( efftype_id( e.get_string( "id" ) ), e.get_int( "duration", 0 ),
get_body_part_token( e.get_string( "bp", "NUM_BP" ) ), e.get_bool( "permanent", false ),
e.get_int( "chance", 100 ) );
atk_effs.push_back( new_eff );
}
}
if( jo.has_member( "death_drops" ) ) {
JsonIn &stream = *jo.get_raw( "death_drops" );
death_drops = item_group::load_item_group( stream, "distribution" );
}
const typed_flag_reader<decltype( gen.death_map )> death_reader{ gen.death_map, "invalid monster death function" };
optional( jo, was_loaded, "death_function", dies, death_reader );
if( dies.empty() ) {
// TODO: really needed? Is an empty `dies` container not allowed?
dies.push_back( mdeath::normal );
}
if( jo.has_member( "special_when_hit" ) ) {
JsonArray jsarr = jo.get_array( "special_when_hit" );
const auto iter = gen.defense_map.find( jsarr.get_string( 0 ) );
if( iter == gen.defense_map.end() ) {
//.........这里部分代码省略.........
示例8: load
void mutation_branch::load( JsonObject &jo, const std::string & )
{
mandatory( jo, was_loaded, "id", id );
mandatory( jo, was_loaded, "name", raw_name, translated_string_reader );
mandatory( jo, was_loaded, "description", raw_desc, translated_string_reader );
mandatory( jo, was_loaded, "points", points );
optional( jo, was_loaded, "visibility", visibility, 0 );
optional( jo, was_loaded, "ugliness", ugliness, 0 );
optional( jo, was_loaded, "starting_trait", startingtrait, false );
optional( jo, was_loaded, "mixed_effect", mixed_effect, false );
optional( jo, was_loaded, "active", activated, false );
optional( jo, was_loaded, "starts_active", starts_active, false );
optional( jo, was_loaded, "destroys_gear", destroys_gear, false );
optional( jo, was_loaded, "allow_soft_gear", allow_soft_gear, false );
optional( jo, was_loaded, "cost", cost, 0 );
optional( jo, was_loaded, "time", cooldown, 0 );
optional( jo, was_loaded, "hunger", hunger, false );
optional( jo, was_loaded, "thirst", thirst, false );
optional( jo, was_loaded, "fatigue", fatigue, false );
optional( jo, was_loaded, "valid", valid, true );
optional( jo, was_loaded, "purifiable", purifiable, true );
if( jo.has_object( "spawn_item" ) ) {
auto si = jo.get_object( "spawn_item" );
optional( si, was_loaded, "type", spawn_item );
optional( si, was_loaded, "message", raw_spawn_item_message );
}
if( jo.has_object( "ranged_mutation" ) ) {
auto si = jo.get_object( "ranged_mutation" );
optional( si, was_loaded, "type", ranged_mutation );
optional( si, was_loaded, "message", raw_ranged_mutation_message );
}
optional( jo, was_loaded, "initial_ma_styles", initial_ma_styles );
if( jo.has_array( "bodytemp_modifiers" ) ) {
auto bodytemp_array = jo.get_array( "bodytemp_modifiers" );
bodytemp_min = bodytemp_array.get_int( 0 );
bodytemp_max = bodytemp_array.get_int( 1 );
}
optional( jo, was_loaded, "bodytemp_sleep", bodytemp_sleep, 0 );
optional( jo, was_loaded, "threshold", threshold, false );
optional( jo, was_loaded, "profession", profession, false );
optional( jo, was_loaded, "debug", debug, false );
optional( jo, was_loaded, "player_display", player_display, true );
JsonArray vr = jo.get_array( "vitamin_rates" );
while( vr.has_more() ) {
auto pair = vr.next_array();
vitamin_rates.emplace( vitamin_id( pair.get_string( 0 ) ),
time_duration::from_turns( pair.get_int( 1 ) ) );
}
auto vam = jo.get_array( "vitamins_absorb_multi" );
while( vam.has_more() ) {
auto pair = vam.next_array();
std::map<vitamin_id, double> vit;
auto vit_array = pair.get_array( 1 );
// fill the inner map with vitamins
while( vit_array.has_more() ) {
auto vitamins = vit_array.next_array();
vit.emplace( vitamin_id( vitamins.get_string( 0 ) ), vitamins.get_float( 1 ) );
}
// assign the inner vitamin map to the material_id key
vitamin_absorb_multi.emplace( material_id( pair.get_string( 0 ) ), vit );
}
optional( jo, was_loaded, "healing_awake", healing_awake, 0.0f );
optional( jo, was_loaded, "healing_resting", healing_resting, 0.0f );
optional( jo, was_loaded, "hp_modifier", hp_modifier, 0.0f );
optional( jo, was_loaded, "hp_modifier_secondary", hp_modifier_secondary, 0.0f );
optional( jo, was_loaded, "hp_adjustment", hp_adjustment, 0.0f );
optional( jo, was_loaded, "stealth_modifier", stealth_modifier, 0.0f );
optional( jo, was_loaded, "str_modifier", str_modifier, 0.0f );
optional( jo, was_loaded, "dodge_modifier", dodge_modifier, 0.0f );
optional( jo, was_loaded, "speed_modifier", speed_modifier, 1.0f );
optional( jo, was_loaded, "movecost_modifier", movecost_modifier, 1.0f );
optional( jo, was_loaded, "movecost_flatground_modifier", movecost_flatground_modifier, 1.0f );
optional( jo, was_loaded, "movecost_obstacle_modifier", movecost_obstacle_modifier, 1.0f );
optional( jo, was_loaded, "attackcost_modifier", attackcost_modifier, 1.0f );
optional( jo, was_loaded, "max_stamina_modifier", max_stamina_modifier, 1.0f );
optional( jo, was_loaded, "weight_capacity_modifier", weight_capacity_modifier, 1.0f );
optional( jo, was_loaded, "hearing_modifier", hearing_modifier, 1.0f );
optional( jo, was_loaded, "noise_modifier", noise_modifier, 1.0f );
optional( jo, was_loaded, "metabolism_modifier", metabolism_modifier, 0.0f );
optional( jo, was_loaded, "thirst_modifier", thirst_modifier, 0.0f );
optional( jo, was_loaded, "fatigue_modifier", fatigue_modifier, 0.0f );
optional( jo, was_loaded, "fatigue_regen_modifier", fatigue_regen_modifier, 0.0f );
optional( jo, was_loaded, "stamina_regen_modifier", stamina_regen_modifier, 0.0f );
optional( jo, was_loaded, "overmap_sight", overmap_sight, 0.0f );
optional( jo, was_loaded, "overmap_multiplier", overmap_multiplier, 1.0f );
if( jo.has_object( "social_modifiers" ) ) {
JsonObject sm = jo.get_object( "social_modifiers" );
social_mods = load_mutation_social_mods( sm );
}
load_mutation_mods( jo, "passive_mods", mods );
//.........这里部分代码省略.........
示例9: load_terrain
void load_terrain(JsonObject &jsobj)
{
ter_t new_terrain;
new_terrain.id = jsobj.get_string("id");
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")) {
new_terrain.trap = trap_id_from_string(jsobj.get_string("trap"));
} else {
new_terrain.trap = tr_null;
}
new_terrain.transparent = false;
new_terrain.bitflags = 0;
JsonArray flags = jsobj.get_array("flags");
while(flags.has_more()) {
new_terrain.set_flag(flags.next_string());
}
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");
}
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");
}
/*
requires copying json object
if( jsobj.has_member("bash") ) {
if( jsobj.is_object("bash") ) {
JsonObject delayed(jsobj.get_object("bash"));
delayed_json["terrain_bash"][new_terrain.id] = delayed;//jsobj.get_object("bash");
} else if (jsobj.is_string("bash") ) {
// delayed_json["terrain_bash_link"][new_terrain.id] = jsobj.get_string("bash");
}
}
*/
new_terrain.bash.load(jsobj, "bash", false);
new_terrain.loadid=terlist.size();
termap[new_terrain.id]=new_terrain;
terlist.push_back(new_terrain);
}
示例10: init
void input_manager::init() {
init_keycode_mapping();
std::ifstream data_file;
std::string file_name = "data/raw/keybindings.json";
data_file.open(file_name.c_str(), std::ifstream::in | std::ifstream::binary);
if(!data_file.good()) {
throw "Could not read " + file_name;
}
JsonIn jsin(&data_file);
//Crawl through once and create an entry for every definition
jsin.start_array();
while (!jsin.end_array()) {
// JSON object representing the action
JsonObject action = jsin.get_object();
const std::string action_id = action.get_string("id");
actionID_to_name[action_id] = action.get_string("name", action_id);
const std::string context = action.get_string("category", "default");
// Iterate over the bindings JSON array
JsonArray bindings = action.get_array("bindings");
const bool defaultcontext = (context == "default");
while (bindings.has_more()) {
JsonObject keybinding = bindings.next_object();
std::string input_method = keybinding.get_string("input_method");
input_event new_event;
if(input_method == "keyboard") {
new_event.type = CATA_INPUT_KEYBOARD;
} else if(input_method == "gamepad") {
new_event.type = CATA_INPUT_GAMEPAD;
} else if(input_method == "mouse") {
new_event.type = CATA_INPUT_MOUSE;
}
if (keybinding.has_array("key")) {
JsonArray keys = keybinding.get_array("key");
while (keys.has_more()) {
new_event.sequence.push_back(
get_keycode(keys.next_string())
);
}
} else { // assume string if not array, and throw if not string
new_event.sequence.push_back(
get_keycode(keybinding.get_string("key"))
);
}
if (defaultcontext) {
action_to_input[action_id].push_back(new_event);
} else {
action_contexts[context][action_id].push_back(new_event);
}
}
}
data_file.close();
}
示例11: load
bool map_bash_info::load(JsonObject &jsobj, std::string member, bool isfurniture) {
if( jsobj.has_object(member) ) {
JsonObject j = jsobj.get_object(member);
if ( jsonint(j, "num_tests", num_tests ) == false ) {
if ( jsonint(j, "str_min", str_min ) && jsonint(j, "str_max", str_max ) ) {
num_tests = 1;
}
} else if ( num_tests > 0 ) {
str_min = j.get_int("str_min");
str_max = j.get_int("str_max");
}
jsonint(j, "str_min_blocked", str_min_blocked );
jsonint(j, "str_max_blocked", str_max_blocked );
jsonint(j, "str_min_roll", str_min_roll );
jsonint(j, "explosive", explosive );
jsonint(j, "chance", chance );
jsonstring(j, "sound", sound );
jsonstring(j, "sound_fail", sound_fail );
jsonstring(j, "furn_set", furn_set );
if ( jsonstring(j, "ter_set", ter_set ) == false && isfurniture == false ) {
ter_set = "t_rubble";
debugmsg("terrain[\"%s\"].bash.ter_set is not set!",jsobj.get_string("id").c_str() );
}
if ( j.has_array("items") ) {
JsonArray ja = j.get_array("items");
if (ja.size() > 0) {
int c=0;
while ( ja.has_more() ) {
if ( ja.has_object(c) ) {
JsonObject jio = ja.next_object();
if ( jio.has_string("item") && jio.has_int("amount") ) {
if ( jio.has_int("minamount") ) {
map_bash_item_drop drop( jio.get_string("item"), jio.get_int("amount"), jio.get_int("minamount") );
jsonint(jio, "chance", drop.chance);
items.push_back(drop);
} else {
map_bash_item_drop drop( jio.get_string("item"), jio.get_int("amount") );
jsonint(jio, "chance", drop.chance);
items.push_back(drop);
}
} else {
debugmsg("terrain[\"%s\"].bash.items[%d]: invalid entry",jsobj.get_string("id").c_str(),c);
}
} else {
debugmsg("terrain[\"%s\"].bash.items[%d]: invalid entry",jsobj.get_string("id").c_str(),c);
}
c++;
}
}
}
//debugmsg("%d/%d %s %s/%s %d",str_min,str_max, ter_set.c_str(), sound.c_str(), sound_fail.c_str(), items.size() );
return true;
} else {
return false;
}
}
示例12: load_modfile
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);
}
}
//.........这里部分代码省略.........
示例13: load_mutation
void load_mutation(JsonObject &jsobj)
{
trait new_trait;
JsonArray jsarr;
std::string id = jsobj.get_string("id");
new_trait.name = _(jsobj.get_string("name").c_str());
new_trait.description = _(jsobj.get_string("description").c_str());
new_trait.points = jsobj.get_int("points");
new_trait.visibility = jsobj.get_int("visibility", 0);
new_trait.ugliness = jsobj.get_int("ugliness", 0);
new_trait.startingtrait = jsobj.get_bool("starting_trait", false);
traits[id] = new_trait;
mutation_data[id].valid = jsobj.get_bool("valid", true);
mutation_data[id].purifiable = jsobj.get_bool("purifiable", true);
mutation_data[id].threshold = jsobj.get_bool("threshold", false);
jsarr = jsobj.get_array("prereqs");
while (jsarr.has_more()) {
mutation_data[id].prereqs.push_back(jsarr.next_string());
}
// 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, and will likely NOT be regained
// if you lose the mutation they prereq'd for.
jsarr = jsobj.get_array("prereqs2");
while (jsarr.has_more()) {
mutation_data[id].prereqs2.push_back(jsarr.next_string());
}
// Dedicated-purpose prereq slot for Threshold mutations
jsarr = jsobj.get_array("threshreq");
// Stuff like Huge might fit in more than one mutcat post-threshold, so yeah
while (jsarr.has_more()) {
mutation_data[id].threshreq.push_back(jsarr.next_string());
}
jsarr = jsobj.get_array("cancels");
while (jsarr.has_more()) {
mutation_data[id].cancels.push_back(jsarr.next_string());
}
jsarr = jsobj.get_array("changes_to");
while (jsarr.has_more()) {
mutation_data[id].replacements.push_back(jsarr.next_string());
}
jsarr = jsobj.get_array("leads_to");
while (jsarr.has_more()) {
mutation_data[id].additions.push_back(jsarr.next_string());
}
jsarr = jsobj.get_array("category");
while (jsarr.has_more()) {
std::string s = jsarr.next_string();
mutation_data[id].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);
mutation_data[id].protection[part_id] =
mutation_wet(body_parts[part_id], protect);
}
}
示例14: load
void input_manager::load(const std::string &file_name, bool is_user_preferences)
{
std::ifstream data_file(file_name.c_str(), std::ifstream::in | std::ifstream::binary);
if(!data_file.good()) {
// Only throw if this is the first file to load, that file _must_ exist,
// otherwise the keybindings can not be read at all.
if (action_contexts.empty()) {
throw "Could not read " + file_name;
}
return;
}
JsonIn jsin(data_file);
//Crawl through once and create an entry for every definition
jsin.start_array();
while (!jsin.end_array()) {
// JSON object representing the action
JsonObject action = jsin.get_object();
const std::string action_id = action.get_string("id");
const std::string context = action.get_string("category", default_context_id);
t_actions &actions = action_contexts[context];
if (!is_user_preferences && action.has_member("name")) {
// Action names are not user preferences. Some experimental builds
// post-0.A had written action names into the user preferences
// config file. Any names that exist in user preferences will be
// ignored.
actions[action_id].name = action.get_string("name");
}
// Iterate over the bindings JSON array
JsonArray bindings = action.get_array("bindings");
t_input_event_list events;
while (bindings.has_more()) {
JsonObject keybinding = bindings.next_object();
std::string input_method = keybinding.get_string("input_method");
input_event new_event;
if(input_method == "keyboard") {
new_event.type = CATA_INPUT_KEYBOARD;
} else if(input_method == "gamepad") {
new_event.type = CATA_INPUT_GAMEPAD;
} else if(input_method == "mouse") {
new_event.type = CATA_INPUT_MOUSE;
}
if (keybinding.has_array("key")) {
JsonArray keys = keybinding.get_array("key");
while (keys.has_more()) {
new_event.sequence.push_back(
get_keycode(keys.next_string())
);
}
} else { // assume string if not array, and throw if not string
new_event.sequence.push_back(
get_keycode(keybinding.get_string("key"))
);
}
events.push_back(new_event);
}
// An invariant of this class is that user-created, local keybindings
// with an empty set of input_events do not exist in the
// action_contexts map. In prior versions of this class, this was not
// true, so users of experimental builds post-0.A will have empty
// local keybindings saved in their keybindings.json config.
//
// To be backwards compatible with keybindings.json from prior
// experimental builds, we will detect user-created, local keybindings
// with empty input_events and disregard them. When keybindings are
// later saved, these remnants won't be saved.
if (!is_user_preferences ||
!events.empty() ||
context == default_context_id ||
actions.count(action_id) > 0) {
// In case this is the second file containing user preferences,
// this replaces the default bindings with the user's preferences.
action_attributes &attributes = actions[action_id];
attributes.input_events = events;
if (action.has_member("is_user_created")) {
attributes.is_user_created = action.get_bool("is_user_created");
}
}
}
}
示例15: load_monster
void MonsterGenerator::load_monster(JsonObject &jo)
{
// id
std::string mid;
if (jo.has_member("id")) {
mid = jo.get_string("id");
if (mon_templates.count(mid) > 0) {
delete mon_templates[mid];
}
mtype *newmon = new mtype;
newmon->id = mid;
newmon->name = jo.get_string("name").c_str();
if(jo.has_member("name_plural")) {
newmon->name_plural = jo.get_string("name_plural");
} else {
// default behaviour: Assume the regular plural form (appending an “s”)
newmon->name_plural = newmon->name + "s";
}
newmon->description = _(jo.get_string("description").c_str());
newmon->mat = jo.get_string("material");
newmon->species = jo.get_tags("species");
newmon->categories = jo.get_tags("categories");
newmon->sym = jo.get_string("symbol");
if( utf8_wrapper( newmon->sym ).display_width() != 1 ) {
jo.throw_error( "monster symbol should be exactly one console cell width", "symbol" );
}
newmon->color = color_from_string(jo.get_string("color"));
newmon->size = get_from_string(jo.get_string("size", "MEDIUM"), size_map, MS_MEDIUM);
newmon->phase = get_from_string(jo.get_string("phase", "SOLID"), phase_map, SOLID);
newmon->difficulty = jo.get_int("diff", 0);
newmon->agro = jo.get_int("aggression", 0);
newmon->morale = jo.get_int("morale", 0);
newmon->speed = jo.get_int("speed", 0);
newmon->melee_skill = jo.get_int("melee_skill", 0);
newmon->melee_dice = jo.get_int("melee_dice", 0);
newmon->melee_sides = jo.get_int("melee_dice_sides", 0);
newmon->melee_cut = jo.get_int("melee_cut", 0);
newmon->sk_dodge = jo.get_int("dodge", 0);
newmon->armor_bash = jo.get_int("armor_bash", 0);
newmon->armor_cut = jo.get_int("armor_cut", 0);
newmon->hp = jo.get_int("hp", 0);
jo.read("starting_ammo", newmon->starting_ammo);
newmon->luminance = jo.get_float("luminance", 0);
newmon->revert_to_itype = jo.get_string( "revert_to_itype", "" );
if (jo.has_array("attack_effs")) {
JsonArray jsarr = jo.get_array("attack_effs");
while (jsarr.has_more()) {
JsonObject e = jsarr.next_object();
mon_effect_data new_eff(e.get_string("id", "null"), e.get_int("duration", 0),
body_parts[e.get_string("bp", "NUM_BP")], e.get_bool("permanent", false),
e.get_int("chance", 100));
newmon->atk_effs.push_back(new_eff);
}
}
if (jo.has_string("death_drops")) {
newmon->death_drops = jo.get_string("death_drops");
} else if (jo.has_object("death_drops")) {
JsonObject death_frop_json = jo.get_object("death_drops");
// Make up a group name, should be unique (include the monster id),
newmon->death_drops = newmon->id + "_death_drops_auto";
const std::string subtype = death_frop_json.get_string("subtype", "distribution");
// and load the entry as a standard item group using the made up name.
item_group::load_item_group(death_frop_json, newmon->death_drops, subtype);
} else if (jo.has_member("death_drops")) {
jo.throw_error("invalid type, must be string or object", "death_drops");
}
newmon->dies = get_death_functions(jo, "death_function");
load_special_defense(newmon, jo, "special_when_hit");
load_special_attacks(newmon, jo, "special_attacks");
std::set<std::string> flags, anger_trig, placate_trig, fear_trig;
flags = jo.get_tags("flags");
anger_trig = jo.get_tags("anger_triggers");
placate_trig = jo.get_tags("placate_triggers");
fear_trig = jo.get_tags("fear_triggers");
newmon->flags = get_set_from_tags(flags, flag_map, MF_NULL);
newmon->anger = get_set_from_tags(anger_trig, trigger_map, MTRIG_NULL);
newmon->fear = get_set_from_tags(fear_trig, trigger_map, MTRIG_NULL);
newmon->placate = get_set_from_tags(placate_trig, trigger_map, MTRIG_NULL);
mon_templates[mid] = newmon;
}
}