void VehicleFactory::load_vehicle_spawn(JsonObject &jo) { const std::string spawn_id = jo.get_string("id"); VehicleSpawn spawn; JsonArray types = jo.get_array("spawn_types"); while (types.has_more()) { JsonObject type = types.next_object(); if(type.has_object("vehicle_json")) { JsonObject vjo = type.get_object("vehicle_json"); spawn.add(type.get_float("weight"), std::make_shared<VehicleFunction_json>(vjo)); } else if(type.has_string("vehicle_function")) { if(builtin_functions.count(type.get_string("vehicle_function")) == 0) { type.throw_error("load_vehicle_spawn: unable to find builtin function", "vehicle_function"); } spawn.add(type.get_float("weight"), std::make_shared<VehicleFunction_builtin>( builtin_functions[type.get_string("vehicle_function")])); } else { type.throw_error("load_vehicle_spawn: missing required vehicle_json (object) or vehicle_function (string)."); } } spawns[spawn_id] = spawn; }
void load_technique(JsonObject &jo) { ma_technique tec; tec.id = jo.get_string("id"); tec.name = jo.get_string("name", ""); if (!tec.name.empty()) { tec.name = _(tec.name.c_str()); } JsonArray jsarr = jo.get_array("messages"); while (jsarr.has_more()) { tec.messages.push_back(_(jsarr.next_string().c_str())); } tec.reqs.unarmed_allowed = jo.get_bool("unarmed_allowed", false); tec.reqs.melee_allowed = jo.get_bool("melee_allowed", false); tec.reqs.min_melee = jo.get_int("min_melee", 0); tec.reqs.min_unarmed = jo.get_int("min_unarmed", 0); tec.reqs.min_bashing = jo.get_int("min_bashing", 0); tec.reqs.min_cutting = jo.get_int("min_cutting", 0); tec.reqs.min_stabbing = jo.get_int("min_stabbing", 0); tec.reqs.min_bashing_damage = jo.get_int("min_bashing_damage", 0); tec.reqs.min_cutting_damage = jo.get_int("min_cutting_damage", 0); tec.reqs.req_buffs = jo.get_tags("req_buffs"); tec.reqs.req_flags = jo.get_tags("req_flags"); tec.crit_tec = jo.get_bool("crit_tec", false); tec.defensive = jo.get_bool("defensive", false); tec.disarms = jo.get_bool("disarms", false); tec.dodge_counter = jo.get_bool("dodge_counter", false); tec.block_counter = jo.get_bool("block_counter", false); tec.miss_recovery = jo.get_bool("miss_recovery", false); tec.grab_break = jo.get_bool("grab_break", false); tec.flaming = jo.get_bool("flaming", false); tec.hit = jo.get_int("pain", 0); tec.bash = jo.get_int("bash", 0); tec.cut = jo.get_int("cut", 0); tec.pain = jo.get_int("pain", 0); tec.weighting = jo.get_int("weighting", 1); tec.bash_mult = jo.get_float("bash_mult", 1.0); tec.cut_mult = jo.get_float("cut_mult", 1.0); tec.speed_mult = jo.get_float("speed_mult", 1.0); tec.down_dur = jo.get_int("down_dur", 0); tec.stun_dur = jo.get_int("stun_dur", 0); tec.knockback_dist = jo.get_int("knockback_dist", 0); tec.knockback_spread = jo.get_int("knockback_spread", 0); tec.aoe = jo.get_string("aoe", ""); tec.flags = jo.get_tags("flags"); ma_techniques[tec.id] = tec; }
weather_generator weather_generator::load( JsonObject &jo ) { weather_generator ret; ret.base_temperature = jo.get_float( "base_temperature", 6.5 ); ret.base_humidity = jo.get_float( "base_humidity", 66.0 ); ret.base_pressure = jo.get_float( "base_pressure", 1015.0 ); ret.base_acid = jo.get_float( "base_acid", 1015.0 ); return ret; }
void leap_actor::load( JsonObject &obj ) { // Mandatory: max_range = obj.get_float( "max_range" ); // Optional: min_range = obj.get_float( "min_range", 1.0f ); allow_no_target = obj.get_bool( "allow_no_target", true ); move_cost = obj.get_int( "move_cost", 150 ); min_consider_range = obj.get_float( "min_consider_range", 0.0f ); max_consider_range = obj.get_float( "max_consider_range", 200.0f ); }
damage_unit load_damage_unit( JsonObject &curr ) { damage_type dt = dt_by_name( curr.get_string( "damage_type" ) ); if( dt == DT_NULL ) { curr.throw_error( "Invalid damage type" ); } float amount = curr.get_float( "amount" ); int arpen = curr.get_int( "armor_penetration", 0 ); float armor_mul = curr.get_float( "armor_multiplier", 1.0f ); float damage_mul = curr.get_float( "damage_multiplier", 1.0f ); return damage_unit( dt, amount, arpen, armor_mul, damage_mul ); }
// load a material object from incoming JSON void material_type::load_material( JsonObject &jsobj ) { material_type mat; mat._ident = jsobj.get_string( "ident" ); mat._name = _( jsobj.get_string( "name" ).c_str() ); mat._salvage_id = jsobj.get_string( "salvage_id", "null" ); mat._salvage_multiplier = jsobj.get_float( "salvage_multiplier", 1.0 ); mat._bash_resist = jsobj.get_int( "bash_resist" ); mat._cut_resist = jsobj.get_int( "cut_resist" ); mat._bash_dmg_verb = _( jsobj.get_string( "bash_dmg_verb" ).c_str() ); mat._cut_dmg_verb = _( jsobj.get_string( "cut_dmg_verb" ).c_str() ); mat._acid_resist = jsobj.get_int( "acid_resist" ); mat._elec_resist = jsobj.get_int( "elec_resist" ); mat._fire_resist = jsobj.get_int( "fire_resist" ); mat._chip_resist = jsobj.get_int( "chip_resist" ); mat._density = jsobj.get_int( "density" ); JsonArray jsarr = jsobj.get_array( "dmg_adj" ); mat._dmg_adj[0] = _( jsarr.next_string().c_str() ); mat._dmg_adj[1] = _( jsarr.next_string().c_str() ); mat._dmg_adj[2] = _( jsarr.next_string().c_str() ); mat._dmg_adj[3] = _( jsarr.next_string().c_str() ); _all_materials[mat._ident] = mat; DebugLog( D_INFO, DC_ALL ) << "Loaded material: " << mat._name; }
distribution load_distribution( JsonObject &jo ) { if( jo.has_float( "constant" ) ) { return distribution::constant( jo.get_float( "constant" ) ); } if( jo.has_float( "one_in" ) ) { return distribution::one_in( jo.get_float( "one_in" ) ); } if( jo.has_array( "dice" ) ) { JsonArray jarr = jo.get_array( "dice" ); return distribution::dice_roll( jarr.get_int( 0 ), jarr.get_int( 1 ) ); } if( jo.has_array( "rng" ) ) { JsonArray jarr = jo.get_array( "rng" ); return distribution::rng_roll( jarr.get_int( 0 ), jarr.get_int( 1 ) ); } if( jo.has_array( "sum" ) ) { JsonArray jarr = jo.get_array( "sum" ); JsonObject obj = jarr.next_object(); distribution ret = load_distribution( obj ); while( jarr.has_more() ) { obj = jarr.next_object(); ret = ret + load_distribution( obj ); } return ret; } if( jo.has_array( "mul" ) ) { JsonArray jarr = jo.get_array( "mul" ); JsonObject obj = jarr.next_object(); distribution ret = load_distribution( obj ); while( jarr.has_more() ) { obj = jarr.next_object(); ret = ret * load_distribution( obj ); } return ret; } jo.throw_error( "Invalid distribution" ); return distribution(); }
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()); 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")[0]; // will fail here if there is no 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->item_chance = jo.get_int("item_chance", 0); newmon->hp = jo.get_int("hp", 0); newmon->sp_freq = jo.get_int("special_freq", 0); newmon->luminance = jo.get_float("luminance", 0); newmon->dies = get_death_functions(jo, "death_function"); newmon->sp_attack = get_attack_function(jo, "special_attack"); std::set<std::string> flags, anger_trig, placate_trig, fear_trig, cats; 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; } }
void gun_actor::load( JsonObject &obj ) { // Mandatory gun_type = obj.get_string( "gun_type" ); ammo_type = obj.get_string( "ammo_type" ); JsonArray jarr = obj.get_array( "fake_skills" ); while( jarr.has_more() ) { JsonArray cur = jarr.next_array(); fake_skills[skill_id( cur.get_string( 0 ) )] = cur.get_int( 1 ); } range = obj.get_float( "range" ); description = obj.get_string( "description" ); move_cost = obj.get_int( "move_cost" ); targeting_cost = obj.get_int( "targeting_cost" ); // Optional: max_ammo = obj.get_int( "max_ammo", INT_MAX ); fake_str = obj.get_int( "fake_str", 8 ); fake_dex = obj.get_int( "fake_dex", 8 ); fake_int = obj.get_int( "fake_int", 8 ); fake_per = obj.get_int( "fake_per", 8 ); require_targeting_player = obj.get_bool( "require_targeting_player", true ); require_targeting_npc = obj.get_bool( "require_targeting_npc", false ); require_targeting_monster = obj.get_bool( "require_targeting_monster", false ); targeting_timeout = obj.get_int( "targeting_timeout", 8 ); targeting_timeout_extend = obj.get_int( "targeting_timeout_extend", 3 ); burst_limit = obj.get_int( "burst_limit", INT_MAX ); laser_lock = obj.get_bool( "laser_lock", false ); range_no_burst = obj.get_float( "range_no_burst", range + 1 ); if( obj.has_member( "targeting_sound" ) || obj.has_member( "targeting_volume" ) ) { // Both or neither, but not just one targeting_sound = obj.get_string( "targeting_sound" ); targeting_volume = obj.get_int( "targeting_volume" ); } // Sound of no ammo no_ammo_sound = obj.get_string( "no_ammo_sound", "" ); }
std::array<float, NUM_DT> load_damage_array( JsonObject &jo ) { std::array<float, NUM_DT> ret; float init_val = jo.get_float( "all", 0.0f ); float phys = jo.get_float( "physical", init_val ); ret[ DT_BASH ] = jo.get_float( "bash", phys ); ret[ DT_CUT ] = jo.get_float( "cut", phys ); ret[ DT_STAB ] = jo.get_float( "stab", phys ); float non_phys = jo.get_float( "non_physical", init_val ); ret[ DT_BIOLOGICAL ] = jo.get_float( "biological", non_phys ); ret[ DT_ACID ] = jo.get_float( "acid", non_phys ); ret[ DT_HEAT ] = jo.get_float( "heat", non_phys ); ret[ DT_COLD ] = jo.get_float( "cold", non_phys ); ret[ DT_ELECTRIC ] = jo.get_float( "electric", non_phys ); // DT_TRUE should never be resisted ret[ DT_TRUE ] = 0.0f; return ret; }
void bite_actor::load( JsonObject &obj ) { // Optional: if( obj.has_array( "damage_max_instance" ) ) { JsonArray arr = obj.get_array( "damage_max_instance" ); damage_max_instance = load_damage_instance( arr ); } else if( obj.has_object( "damage_max_instance" ) ) { damage_max_instance = load_damage_instance( obj ); } min_mul = obj.get_float( "min_mul", 0.0f ); max_mul = obj.get_float( "max_mul", 1.0f ); move_cost = obj.get_int( "move_cost", 100 ); accuracy = obj.get_int( "accuracy", INT_MIN ); no_infection_chance = obj.get_int( "no_infection_chance", 14 ); }
void melee_actor::load_internal( JsonObject &obj, const std::string & ) { // Optional: if( obj.has_array( "damage_max_instance" ) ) { JsonArray arr = obj.get_array( "damage_max_instance" ); damage_max_instance = load_damage_instance( arr ); } else if( obj.has_object( "damage_max_instance" ) ) { damage_max_instance = load_damage_instance( obj ); } min_mul = obj.get_float( "min_mul", 0.0f ); max_mul = obj.get_float( "max_mul", 1.0f ); move_cost = obj.get_int( "move_cost", 100 ); accuracy = obj.get_int( "accuracy", INT_MIN ); optional( obj, was_loaded, "miss_msg_u", miss_msg_u, translated_string_reader, _( "The %s lunges at you, but you dodge!" ) ); optional( obj, was_loaded, "no_dmg_msg_u", no_dmg_msg_u, translated_string_reader, _( "The %1$s bites your %2$s, but fails to penetrate armor!" ) ); optional( obj, was_loaded, "hit_dmg_u", hit_dmg_u, translated_string_reader, _( "The %1$s bites your %2$s!" ) ); optional( obj, was_loaded, "miss_msg_npc", miss_msg_npc, translated_string_reader, _( "The %s lunges at <npcname>, but they dodge!" ) ); optional( obj, was_loaded, "no_dmg_msg_npc", no_dmg_msg_npc, translated_string_reader, _( "The %1$s bites <npcname>'s %2$s, but fails to penetrate armor!" ) ); optional( obj, was_loaded, "hit_dmg_npc", hit_dmg_npc, translated_string_reader, _( "The %1$s bites <npcname>'s %2$s!" ) ); if( obj.has_array( "body_parts" ) ) { JsonArray jarr = obj.get_array( "body_parts" ); while( jarr.has_more() ) { JsonArray sub = jarr.next_array(); const body_part bp = get_body_part_token( sub.get_string( 0 ) ); const float prob = sub.get_float( 1 ); body_parts.add_or_replace( bp, prob ); } } if( obj.has_array( "effects" ) ) { JsonArray jarr = obj.get_array( "effects" ); while( jarr.has_more() ) { JsonObject eff = jarr.next_object(); effects.push_back( load_mon_effect_data( eff ) ); } } }
distribution load_distribution( JsonObject &jo, const std::string &name ) { if( !jo.has_member( name ) ) { return distribution(); } if( jo.has_float( name ) ) { return distribution::constant( jo.get_float( name ) ); } if( jo.has_object( name ) ) { JsonObject obj = jo.get_object( name ); return load_distribution( obj ); } jo.throw_error( "Invalid distribution type", name ); return distribution(); }
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 = jo.get_string("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")[0]; // will fail here if there is no 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); newmon->sp_freq = jo.get_int("special_freq", 0); newmon->def_chance = jo.get_int("special_when_hit_freq", 0); newmon->luminance = jo.get_float("luminance", 0); 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_controller->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"); newmon->sp_attack = get_attack_function(jo, "special_attack"); newmon->sp_defense = get_defense_function(jo, "special_when_hit"); std::set<std::string> flags, anger_trig, placate_trig, fear_trig, cats; 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; } }
ma_buff load_buff(JsonObject &jo) { ma_buff buff; buff.id = jo.get_string("id"); buff.name = _(jo.get_string("name").c_str()); buff.description = _(jo.get_string("description").c_str()); buff.buff_duration = jo.get_int("buff_duration", 2); buff.max_stacks = jo.get_int("max_stacks", 1); buff.reqs.unarmed_allowed = jo.get_bool("unarmed_allowed", false); buff.reqs.melee_allowed = jo.get_bool("melee_allowed", false); buff.reqs.min_melee = jo.get_int("min_melee", 0); buff.reqs.min_unarmed = jo.get_int("min_unarmed", 0); buff.dodges_bonus = jo.get_int("bonus_dodges", 0); buff.blocks_bonus = jo.get_int("bonus_blocks", 0); buff.hit = jo.get_int("hit", 0); buff.bash = jo.get_int("bash", 0); buff.cut = jo.get_int("cut", 0); buff.dodge = jo.get_int("dodge", 0); buff.speed = jo.get_int("speed", 0); buff.block = jo.get_int("block", 0); buff.arm_bash = jo.get_int("arm_bash", 0); buff.arm_cut = jo.get_int("arm_cut", 0); buff.bash_stat_mult = jo.get_float("bash_mult", 1.0); buff.cut_stat_mult = jo.get_float("cut_mult", 1.0); buff.hit_str = jo.get_float("hit_str", 0.0); buff.hit_dex = jo.get_float("hit_dex", 0.0); buff.hit_int = jo.get_float("hit_int", 0.0); buff.hit_per = jo.get_float("hit_per", 0.0); buff.bash_str = jo.get_float("bash_str", 0.0); buff.bash_dex = jo.get_float("bash_dex", 0.0); buff.bash_int = jo.get_float("bash_int", 0.0); buff.bash_per = jo.get_float("bash_per", 0.0); buff.cut_str = jo.get_float("cut_str", 0.0); buff.cut_dex = jo.get_float("cut_dex", 0.0); buff.cut_int = jo.get_float("cut_int", 0.0); buff.cut_per = jo.get_float("cut_per", 0.0); buff.dodge_str = jo.get_float("dodge_str", 0.0); buff.dodge_dex = jo.get_float("dodge_dex", 0.0); buff.dodge_int = jo.get_float("dodge_int", 0.0); buff.dodge_per = jo.get_float("dodge_per", 0.0); buff.block_str = jo.get_float("block_str", 0.0); buff.block_dex = jo.get_float("block_dex", 0.0); buff.block_int = jo.get_float("block_int", 0.0); buff.block_per = jo.get_float("block_per", 0.0); buff.quiet = jo.get_bool("quiet", false); buff.throw_immune = jo.get_bool("throw_immune", false); buff.reqs.req_buffs = jo.get_tags("req_buffs"); ma_buffs[buff.id] = buff; return buff; }
void MonsterGenerator::load_monster(JsonObject &jo) { const mtype_id mid = mtype_id( 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()); // Have to overwrite the default { "hflesh" } here newmon->mat = { jo.get_string("material") }; for( auto &s : jo.get_tags( "species" ) ) { newmon->species.insert( species_id( s ) ); } newmon->categories = jo.get_tags("categories"); // See monfaction.cpp newmon->default_faction = monfactions::get_or_add_faction( mfaction_str_id( jo.get_string("default_faction") ) ); 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"), Creature::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->attack_cost = jo.get_int("attack_cost", 100); 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", "" ); newmon->vision_day = jo.get_int("vision_day", 40); newmon->vision_night = jo.get_int("vision_night", 1); 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), get_body_part_token( 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_member( "death_drops" ) ) { JsonIn& stream = *jo.get_raw( "death_drops" ); newmon->death_drops = item_group::load_item_group( stream, "distribution" ); } newmon->dies = get_death_functions(jo, "death_function"); load_special_defense(newmon, jo, "special_when_hit"); load_special_attacks(newmon, jo, "special_attacks"); if (jo.has_member("upgrades")) { JsonObject upgrades = jo.get_object("upgrades"); newmon->half_life = upgrades.get_int("half_life", -1); newmon->upgrade_group = mongroup_id( upgrades.get_string("into_group", mongroup_id::NULL_ID.str() ) ); newmon->upgrade_into = mtype_id( upgrades.get_string("into", mtype_id::NULL_ID.str() ) ); newmon->upgrades = true; } 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; }
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; } }