diff --git a/src/Main.cc b/src/Main.cc index ffc61230..0a3c9554 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -1605,7 +1605,7 @@ Action a_cat_client( Action a_convert_rare_item_set( "convert-rare-item-set", "\ - convert-rare-item-set INPUT-FILENAME [OUTPUT-FILENAME]\n\ + convert-rare-item-set INPUT-FILENAME [OUTPUT-FILENAME] [OPTIONS]\n\ If OUTPUT-FILENAME is not given, print the contents of a rare item table in\n\ a human-readable format. Otherwise, convert the input rare item set to a\n\ different format and write it to OUTPUT-FILENAME. Both filenames must end\n\ @@ -1614,10 +1614,13 @@ Action a_convert_rare_item_set( .gsl (PSO BB little-endian GSL archive)\n\ .gslb (PSO GC big-endian GSL archive)\n\ .afs (PSO V2 little-endian AFS archive)\n\ - .rel (Schtserv rare table; cannot be used in output filename)\n", + .rel (Schtserv rare table; cannot be used in output filename)\n\ + If the --multiply=X option is given, multiplies all drop rates by X (given\n\ + as a decimal value).\n", +[](Arguments& args) { auto version = get_cli_version(args); + double rate_factor = args.get("multiply"); auto s = make_shared("system/config.json"); s->load_config_early(); s->load_patch_indexes(false); @@ -1646,6 +1649,10 @@ Action a_convert_rare_item_set( throw runtime_error("cannot determine input format; use a filename ending with .json, .gsl, .gslb, .afs, or .rel"); } + if (rate_factor != 1.0) { + rs->multiply_all_rates(rate_factor); + } + string output_filename = args.get(2, false); if (output_filename.empty() || (output_filename == "-")) { rs->print_all_collections(stdout, s->item_name_index(version)); diff --git a/src/RareItemSet.cc b/src/RareItemSet.cc index c90c3269..8ea0720e 100644 --- a/src/RareItemSet.cc +++ b/src/RareItemSet.cc @@ -509,6 +509,21 @@ JSON RareItemSet::json(shared_ptr name_index) const { return modes_dict; } +void RareItemSet::multiply_all_rates(double factor) { + auto multiply_rates_vec = +[](vector>& vec, double factor) -> void { + for (auto& vec_it : vec) { + for (auto& z_it : vec_it) { + uint64_t new_probability = z_it.probability * factor; + z_it.probability = min(new_probability, 0xFFFFFFFF); + } + } + }; + for (auto& coll_it : this->collections) { + multiply_rates_vec(coll_it.second.rt_index_to_specs, factor); + multiply_rates_vec(coll_it.second.box_area_to_specs, factor); + } +} + void RareItemSet::print_collection( FILE* stream, GameMode mode, diff --git a/src/RareItemSet.hh b/src/RareItemSet.hh index aace5c9c..bc746cc4 100644 --- a/src/RareItemSet.hh +++ b/src/RareItemSet.hh @@ -39,6 +39,8 @@ public: std::string serialize_gsl(bool big_endian) const; JSON json(std::shared_ptr name_index = nullptr) const; + void multiply_all_rates(double factor); + void print_collection( FILE* stream, GameMode mode,