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(); }
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 npc_class::load( JsonObject &jo, const std::string & ) { mandatory( jo, was_loaded, "name", name, translated_string_reader ); mandatory( jo, was_loaded, "job_description", job_description, translated_string_reader ); optional( jo, was_loaded, "common", common, true ); bonus_str = load_distribution( jo, "bonus_str" ); bonus_dex = load_distribution( jo, "bonus_dex" ); bonus_int = load_distribution( jo, "bonus_int" ); bonus_per = load_distribution( jo, "bonus_per" ); optional( jo, was_loaded, "shopkeeper_item_group", shopkeeper_item_group, "EMPTY_GROUP" ); optional( jo, was_loaded, "worn_override", worn_override ); optional( jo, was_loaded, "carry_override", carry_override ); optional( jo, was_loaded, "weapon_override", weapon_override ); if( jo.has_array( "traits" ) ) { JsonArray jarr = jo.get_array( "traits" ); while( jarr.has_more() ) { JsonArray jarr_in = jarr.next_array(); traits[ trait_id( jarr_in.get_string( 0 ) ) ] = jarr_in.get_int( 1 ); } } if( jo.has_array( "skills" ) ) { JsonArray jarr = jo.get_array( "skills" ); while( jarr.has_more() ) { JsonObject skill_obj = jarr.next_object(); auto skill_ids = skill_obj.get_tags( "skill" ); if( skill_obj.has_object( "level" ) ) { distribution dis = load_distribution( skill_obj, "level" ); for( const auto &sid : skill_ids ) { skills[ skill_id( sid ) ] = dis; } } else { distribution dis = load_distribution( skill_obj, "bonus" ); for( const auto &sid : skill_ids ) { bonus_skills[ skill_id( sid ) ] = dis; } } } } }
void npc_class::load( JsonObject &jo, const std::string & ) { mandatory( jo, was_loaded, "name", name, translated_string_reader ); mandatory( jo, was_loaded, "job_description", job_description, translated_string_reader ); optional( jo, was_loaded, "common", common, true ); bonus_str = load_distribution( jo, "bonus_str" ); bonus_dex = load_distribution( jo, "bonus_dex" ); bonus_int = load_distribution( jo, "bonus_int" ); bonus_per = load_distribution( jo, "bonus_per" ); optional( jo, was_loaded, "shopkeeper_item_group", shopkeeper_item_group, "EMPTY_GROUP" ); optional( jo, was_loaded, "worn_override", worn_override ); optional( jo, was_loaded, "carry_override", carry_override ); optional( jo, was_loaded, "weapon_override", weapon_override ); if( jo.has_array( "traits" ) ) { traits = trait_group::load_trait_group( *jo.get_raw( "traits" ), "collection" ); } /* Mutation rounds can be specified as follows: * "mutation_rounds": { * "ANY" : { "constant": 1 }, * "INSECT" : { "rng": [1, 3] } * } */ if( jo.has_object( "mutation_rounds" ) ) { const std::map<std::string, mutation_category_trait> &mutation_categories = mutation_category_trait::get_all(); auto jo2 = jo.get_object( "mutation_rounds" ); for( auto &mutation : jo2.get_member_names() ) { auto category_match = [&mutation]( std::pair<const std::string, mutation_category_trait> p ) { return p.second.id == mutation; }; if( std::find_if( mutation_categories.begin(), mutation_categories.end(), category_match ) == mutation_categories.end() ) { debugmsg( "Unrecognized mutation category %s", mutation ); continue; } auto distrib = jo2.get_object( mutation ); mutation_rounds[mutation] = load_distribution( distrib ); } } if( jo.has_array( "skills" ) ) { JsonArray jarr = jo.get_array( "skills" ); while( jarr.has_more() ) { JsonObject skill_obj = jarr.next_object(); auto skill_ids = skill_obj.get_tags( "skill" ); if( skill_obj.has_object( "level" ) ) { distribution dis = load_distribution( skill_obj, "level" ); for( const auto &sid : skill_ids ) { skills[ skill_id( sid ) ] = dis; } } else { distribution dis = load_distribution( skill_obj, "bonus" ); for( const auto &sid : skill_ids ) { bonus_skills[ skill_id( sid ) ] = dis; } } } } }