diff --git a/SerialPrograms/Source/PokemonFRLG/Programs/RngManipulation/PokemonFRLG_GiftRng.cpp b/SerialPrograms/Source/PokemonFRLG/Programs/RngManipulation/PokemonFRLG_GiftRng.cpp index 62926992c0..bc19c2e448 100644 --- a/SerialPrograms/Source/PokemonFRLG/Programs/RngManipulation/PokemonFRLG_GiftRng.cpp +++ b/SerialPrograms/Source/PokemonFRLG/Programs/RngManipulation/PokemonFRLG_GiftRng.cpp @@ -461,9 +461,14 @@ void GiftRng::program(SingleSwitchProgramEnvironment& env, ProControllerContext& std::vector search_hits = get_search_results(env.console, searcher, filters, SEED_VALUES, ADVANCES, advances_radius, GENDER_THRESHOLD); RNG_CALIBRATION.set_hits(search_hits); + bool force_finish = ( + (MAX_RARE_CANDIES == 0) + || all_equal(search_hits) + || all_indistinguishable(search_hits, searcher, GENDER_THRESHOLD) + ); bool finished = update_history( env.console, uncertain_history, calibration_history, MAX_HISTORY_LENGTH, - calibrations, search_hits, 1, 2, MAX_RARE_CANDIES == 0 + calibrations, search_hits, 1, 2, force_finish ); for (uint64_t i=0; i max_advance_possibilities){ + if (!force_finish && search_hits.size() > max_advance_possibilities && !all_equal(search_hits)){ return false; } - - if (search_hits.size() == 1){ - console.log("Hit " + to_hex_string(search_hits[0].seed) + " / " + std::to_string(search_hits[0].advance)); - console.log("Updating calibrations..."); - calibration_history.calibrations.emplace_back(calibrations); - calibration_history.results.emplace_back(search_hits[0]); - if (calibration_history.results.size() > max_history_length){ - calibration_history.calibrations.erase(calibration_history.calibrations.begin()); - calibration_history.results.erase(calibration_history.results.begin()); - } - uncertain_history.results.clear(); - uncertain_history.calibrations.clear(); - return true; - } - std::vector uncal_advances; + std::vector uncal_advances; // hit advance - calibrations std::vector hits; for(auto hit : search_hits) { uncal_advances.emplace_back(int64_t(std::round(hit.advance - calibrations.csf_offset - calibrations.ingame_offset))); hits.emplace_back(hit); } - // get unique advances + // get unique advances from new search results std::sort(uncal_advances.begin(), uncal_advances.end()); std::vector::iterator iter; iter = std::unique(uncal_advances.begin(), uncal_advances.begin() + uncal_advances.size()); uncal_advances.resize(std::distance(uncal_advances.begin(), iter)); + int64_t mode = 0; uncertain_history.calibrations.emplace_back(calibrations); uncertain_history.results.emplace_back(hits); - - // check advance history for repeated values - std::vector counts; - uint64_t best = 0; - int64_t mode = 0; // sum of calibration and hit advance - bool tie = false; - for (int64_t& uadv : uncal_advances){ - uint64_t count = 0; - for (size_t i=0; i counts; + uint64_t best = 0; + bool tie = false; + for (int64_t& uadv : uncal_advances){ + uint64_t count = 0; + for (size_t i=0; i best){ + mode = uadv; + best = count; + tie = false; + }else if (count == best){ + tie = true; + } } - if (count > best){ - mode = uadv; - best = count; - tie = false; - }else if (count == best){ - tie = true; - } - } - if (tie){ - console.log("More than 1 possible advances value hit."); - return true; + if (tie){ + console.log("More than 1 possible advances value hit."); + return true; + } } - - + // add the closest possibility to the advances mode for each attempt to the calibration history - console.log("Inferred hits from previous " + std::to_string(uncertain_history.results.size()) + " attempts: "); + console.log("Hits from previous " + std::to_string(uncertain_history.results.size()) + " attempt(s): "); for (size_t i=0; i& search_hits){ + if (search_hits.size() < 2){ return true; } + const AdvRngState& first = search_hits[0]; + for (size_t i=1; i& search_hits); + bool all_indistinguishable(const std::vector& hits, AdvRngSearcher& searcher, const int16_t& gender_threshold); bool all_indistinguishable(const std::vector& hits, AdvRngWildSearcher& searcher, const int16_t& gender_threshold, bool super_rod); bool all_indistinguishable( diff --git a/SerialPrograms/Source/PokemonFRLG/Programs/RngManipulation/PokemonFRLG_RoamingLegendaryRng.cpp b/SerialPrograms/Source/PokemonFRLG/Programs/RngManipulation/PokemonFRLG_RoamingLegendaryRng.cpp index bb2e9fd7d0..72913b9af8 100644 --- a/SerialPrograms/Source/PokemonFRLG/Programs/RngManipulation/PokemonFRLG_RoamingLegendaryRng.cpp +++ b/SerialPrograms/Source/PokemonFRLG/Programs/RngManipulation/PokemonFRLG_RoamingLegendaryRng.cpp @@ -431,12 +431,16 @@ void RoamingLegendaryRng::program(SingleSwitchProgramEnvironment& env, ProContro RNG_FILTERS.set(filters); std::vector search_hits = get_search_results(env.console, searcher, filters, SEED_VALUES, ADVANCES, advances_radius, GENDER_THRESHOLD); - RNG_CALIBRATION.set_hits(search_hits); + RNG_CALIBRATION.set_hits(search_hits); + bool force_finish = ( + (MAX_RARE_CANDIES == 0) + || all_equal(search_hits) + || all_indistinguishable(search_hits, searcher, GENDER_THRESHOLD) + ); bool finished = update_history( env.console, uncertain_history, calibration_history, MAX_HISTORY_LENGTH, - calibrations, search_hits, 1, 2, MAX_RARE_CANDIES == 0 + calibrations, search_hits, 1, 2, force_finish ); - finished = finished || all_indistinguishable(search_hits, searcher, GENDER_THRESHOLD); for (uint64_t i=0; i search_hits = get_search_results(env.console, searcher, filters, SEED_VALUES, ADVANCES, advances_radius, GENDER_THRESHOLD); - RNG_CALIBRATION.set_hits(search_hits); + RNG_CALIBRATION.set_hits(search_hits); + bool force_finish = ( + (MAX_RARE_CANDIES == 0) + || all_equal(search_hits) + || all_indistinguishable(search_hits, searcher, GENDER_THRESHOLD) + ); bool finished = update_history( env.console, uncertain_history, calibration_history, MAX_HISTORY_LENGTH, - calibrations, search_hits, 1, 2, MAX_RARE_CANDIES == 0 + calibrations, search_hits, 1, 2, force_finish ); for (uint64_t i=0; i search_hits = get_wild_search_results(env.console, searcher, filters, SEED_VALUES, ADVANCES, advances_radius, gender_threshold, SUPER_ROD); - RNG_CALIBRATION.set_hits(search_hits); - bool finished = update_history(env.console, uncertain_history, calibration_history, MAX_HISTORY_LENGTH, calibrations, search_hits, 1, 2, MAX_RARE_CANDIES == 0); - finished = finished || all_indistinguishable(search_hits, searcher, gender_threshold, SUPER_ROD); + RNG_CALIBRATION.set_hits(search_hits); + bool force_finish = ( + (MAX_RARE_CANDIES == 0) + || all_equal(search_hits) + || all_indistinguishable(search_hits, searcher, gender_threshold, SUPER_ROD) + ); + bool finished = update_history(env.console, uncertain_history, calibration_history, MAX_HISTORY_LENGTH, calibrations, search_hits, 1, 2, force_finish); for (uint64_t i=0; i