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(); }