From ac472b1b06dbf1b744640ce8d901143d53f8dc9f Mon Sep 17 00:00:00 2001 From: theAstrogoth Date: Sun, 12 Apr 2026 16:31:16 -0500 Subject: [PATCH 01/10] add initial adv rng calcs --- .../Source/Pokemon/Pokemon_AdvRng.cpp | 206 ++++++++++++++++++ .../Source/Pokemon/Pokemon_AdvRng.h | 136 ++++++++++++ 2 files changed, 342 insertions(+) create mode 100644 SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp create mode 100644 SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h diff --git a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp new file mode 100644 index 0000000000..44c5168b7e --- /dev/null +++ b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp @@ -0,0 +1,206 @@ +/* Xoroshiro128+ and reverse + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#include +#include "Pokemon_AdvRng.h" + +namespace PokemonAutomation{ +namespace Pokemon{ + +uint32_t increment_internal_rng_state(uint32_t& state){ + return state * 0x41c64e6d + 0x6073; +} + +AdvRngState rngstate_from_internal_state(uint16_t seed, uint64_t advances, uint32_t& state){ + uint32_t s0 = state; + uint32_t s1 = increment_internal_rng_state(s0); + uint32_t s2 = increment_internal_rng_state(s1); + uint32_t s3 = increment_internal_rng_state(s2); + uint32_t s4 = increment_internal_rng_state(s3); + + return AdvRngState(seed, advances, s0, s1, s2, s3, s4); +} + +AdvRngState rngstate_from_seed(uint16_t& seed, uint64_t& advances){ + uint32_t state = seed; + for (int i=0; i> 16); +} + +uint8_t gender_value_from_pid(uint32_t& pid){ + return pid & 0xff; +} + +Gender gender_from_gender_value(uint8_t gender_value, uint8_t threshold){ + return (gender_value <= threshold) ? Gender::Female : Gender::Male; +} + +Nature nature_from_pid(uint32_t& pid){ + return Nature (pid % 25); +} + +Ability ability_from_pid(uint32_t& pid){ + return Ability (pid % 2); +} + +IvGroup iv_group_from_state(uint32_t& state){ + IvGroup ivgroup; + uint32_t remainingbits = state; + + ivgroup.iv0 = (remainingbits & 0xfffff) % 32; + remainingbits = remainingbits >> 5; + ivgroup.iv1 = (remainingbits & 0xfffff) % 32; + remainingbits = remainingbits >> 5; + ivgroup.iv2 = (remainingbits & 0xfffff) % 32; + remainingbits = remainingbits >> 5; + + return ivgroup; +} + +AdvPokemonResult pokemon_from_state(AdvRngState& state, RngMethod method = RngMethod::Method1){ + uint32_t pid = pid_from_states(state.s0, state.s1); + uint8_t gender = gender_value_from_pid(pid); + Nature nature = nature_from_pid(pid); + Ability ability = ability_from_pid(pid); + + IvGroup ivgroup1; + IvGroup ivgroup2; + switch(method){ + case RngMethod::Method1: + ivgroup1 = iv_group_from_state(state.s2); + ivgroup2 = iv_group_from_state(state.s3); + break; + case RngMethod::Method2: + ivgroup1 = iv_group_from_state(state.s3); + ivgroup2 = iv_group_from_state(state.s4); + break; + case RngMethod::Method4: + ivgroup1 = iv_group_from_state(state.s2); + ivgroup2 = iv_group_from_state(state.s4); + break; + default: + break; + } + + IVs ivs; + ivs.hp = ivgroup1.iv0; + ivs.attack = ivgroup1.iv1; + ivs.defense = ivgroup1.iv2; + ivs.spatk = ivgroup2.iv0; + ivs.spdef = ivgroup2.iv1; + ivs.speed = ivgroup2.iv2; + + return AdvPokemonResult(pid, gender, nature, ability, ivs); +} + +ShinyType shiny_type_from_pid(uint32_t pid, uint16_t tid_xor_sid){ + uint16_t pid0 = pid >> 16; + uint16_t pid1 = pid & 0xffff; + uint16_t pid_xor (pid0 ^ pid1); + + if (pid_xor == tid_xor_sid){ + return ShinyType::Square; + }else if (pid_xor ^ tid_xor_sid < 8){ + return ShinyType::Star; + }else{ + return ShinyType::Normal; + } +} + + +bool check_for_match(AdvPokemonResult res, AdvRngFilters target, uint16_t tid_xor_sid, uint8_t gender_threshold){ + return (target.nature == Nature::Any || res.nature == target.nature) + && (target.ability == Ability::Any || res.ability == target.ability) + && (target.gender == Gender::Any || gender_from_gender_value(res.gender, gender_threshold) == target.gender) + && (target.shiny == ShinyType::Any || shiny_type_from_pid(res.pid, tid_xor_sid) == target.shiny) + && (target.ivs.hp.low <= res.ivs.hp && target.ivs.hp.high >= res.ivs.hp) + && (target.ivs.attack.low <= res.ivs.attack && target.ivs.attack.high >= res.ivs.attack) + && (target.ivs.defense.low <= res.ivs.defense && target.ivs.defense.high >= res.ivs.defense) + && (target.ivs.spatk.low <= res.ivs.spatk && target.ivs.spatk.high >= res.ivs.spatk) + && (target.ivs.spdef.low <= res.ivs.spdef && target.ivs.spdef.high >= res.ivs.spdef) + && (target.ivs.speed.low <= res.ivs.speed && target.ivs.speed.high >= res.ivs.speed); +} + + + +AdvRng::AdvRng(uint16_t seed, AdvRngState state) + : seed(seed) + , state(state) +{} + +AdvRng::AdvRng(uint16_t seed, uint64_t min_advances) + : seed(seed) + , state(rngstate_from_seed(seed, min_advances)) +{} + +void AdvRng::advance_state(){ + advance_rng_state(state); +} + +void AdvRng::set_state_advances(uint64_t advances){ + state = rngstate_from_seed(seed, advances); +} + +void AdvRng::search_advance_range(std::map& hits, AdvRngFilters& target, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid, uint8_t gender_threshold ){ + for (int m=0; m<3; m++){ + set_state_advances(min_advances); + + RngMethod method; + switch (m){ + case 0: + method = RngMethod::Method1; + break; + case 1: + method = RngMethod::Method2; + break; + case 2: + method = RngMethod::Method4; + break; + default: + break; + } + + if ((target.method != RngMethod::Any) && (target.method != method)){ + continue; + } + + for (int a=min_advances; a AdvRng::search(AdvRngFilters& target, std::vector& seeds, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid, uint8_t gender_threshold){ + std::map hits; + for (uint16_t seed : seeds){ + search_advance_range(hits, target, min_advances, max_advances, tid_xor_sid, gender_threshold); + } + return hits; +} + + +} +} diff --git a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h new file mode 100644 index 0000000000..9b3039d382 --- /dev/null +++ b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h @@ -0,0 +1,136 @@ +/* Advance RNG + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#ifndef PokemonAutomation_PokemonSwSh_AdvRng_H +#define PokemonAutomation_PokemonSwSh_AdvRng_H + +#include +#include +#include +#include "Pokemon_StatsCalculation.h" + +namespace PokemonAutomation{ +namespace Pokemon{ + +struct IvGroup{ + uint8_t iv0; + uint8_t iv1; + uint8_t iv2; +}; + +struct IVs{ + uint8_t hp = 0; + uint8_t attack = 0; + uint8_t defense = 0; + uint8_t spatk = 0; + uint8_t spdef = 0; + uint8_t speed = 0; +}; + +enum class Nature{ + Hardy, + Lonely, + Brave, + Adamant, + Naughty, + Bold, + Docile, + Relaxed, + Impish, + Lax, + Timid, + Hasty, + Serious, + Jolly, + Naive, + Modest, + Mild, + Quiet, + Bashful, + Rash, + Calm, + Gentle, + Sassy, + Careful, + Quirky, + Any +}; + +enum class Gender{ + Male, + Female, + Any +}; + +enum class Ability{ + Zero, + One, + Any +}; + +enum class ShinyType{ + Normal, + Star, + Square, + Any +}; + + +struct AdvRngState{ + AdvRngState(uint16_t seed, uint64_t advance, uint32_t s0, uint32_t s1, uint32_t s2, uint32_t s3, uint32_t s4); + uint16_t seed; + uint64_t advance; + uint32_t s0; + uint32_t s1; + uint32_t s2; + uint32_t s3; + uint32_t s4; +}; + +enum class RngMethod{ + Method1, + Method2, + Method4, + Any +}; + +struct AdvPokemonResult{ + AdvPokemonResult(uint32_t pid, uint16_t gender, Nature nature, Ability ability, IVs ivs); + uint32_t pid; + uint8_t gender; + Nature nature; + Ability ability; + IVs ivs; +}; + +struct AdvRngFilters{ + Gender gender; + Nature nature; + Ability ability; + IvRanges ivs; + ShinyType shiny; + RngMethod method; +}; + +class AdvRng{ +public: + uint16_t seed; + AdvRngState state; + + std::map search(AdvRngFilters& target, std::vector& seeds, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid = 0, uint8_t gender_threshold = 126); +private: + AdvRng(uint16_t seed, AdvRngState state); + AdvRng(uint16_t seed, uint64_t min_advances); + + void set_seed(uint16_t seed); + void set_state_advances(uint64_t advances); + void advance_state(); + void search_advance_range(std::map& hits, AdvRngFilters& target, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid, uint8_t gender_threshold); +}; + +} +} +#endif From 1afa8b5fff6d6fdd6ecb91e0f4f6089595d37572 Mon Sep 17 00:00:00 2001 From: theAstrogoth Date: Sun, 12 Apr 2026 16:33:24 -0500 Subject: [PATCH 02/10] update cmake files --- SerialPrograms/cmake/SourceFiles.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SerialPrograms/cmake/SourceFiles.cmake b/SerialPrograms/cmake/SourceFiles.cmake index 2479d90f97..07ee7b3b1b 100644 --- a/SerialPrograms/cmake/SourceFiles.cmake +++ b/SerialPrograms/cmake/SourceFiles.cmake @@ -1284,6 +1284,8 @@ file(GLOB LIBRARY_SOURCES Source/Pokemon/Pokemon_Types.h Source/Pokemon/Pokemon_Xoroshiro128Plus.cpp Source/Pokemon/Pokemon_Xoroshiro128Plus.h + Source/Pokemon/Pokemon_AdvanceRng.cpp + Source/Pokemon/Pokemon_AdvanceRng.h Source/Pokemon/Resources/Pokemon_BerryNames.cpp Source/Pokemon/Resources/Pokemon_BerryNames.h Source/Pokemon/Resources/Pokemon_BerrySprites.cpp From 25522ff305ebf954d270a4570a0aaad1561e2b6c Mon Sep 17 00:00:00 2001 From: theAstrogoth Date: Sun, 12 Apr 2026 21:08:26 -0500 Subject: [PATCH 03/10] fix new files in cmake --- SerialPrograms/cmake/SourceFiles.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SerialPrograms/cmake/SourceFiles.cmake b/SerialPrograms/cmake/SourceFiles.cmake index 07ee7b3b1b..e9dc45dea9 100644 --- a/SerialPrograms/cmake/SourceFiles.cmake +++ b/SerialPrograms/cmake/SourceFiles.cmake @@ -1284,8 +1284,8 @@ file(GLOB LIBRARY_SOURCES Source/Pokemon/Pokemon_Types.h Source/Pokemon/Pokemon_Xoroshiro128Plus.cpp Source/Pokemon/Pokemon_Xoroshiro128Plus.h - Source/Pokemon/Pokemon_AdvanceRng.cpp - Source/Pokemon/Pokemon_AdvanceRng.h + Source/Pokemon/Pokemon_AdvRng.cpp + Source/Pokemon/Pokemon_AdvRng.h Source/Pokemon/Resources/Pokemon_BerryNames.cpp Source/Pokemon/Resources/Pokemon_BerryNames.h Source/Pokemon/Resources/Pokemon_BerrySprites.cpp From 42b79ffeaf16b420ce54c4aa7e71adaf7d0e7ad6 Mon Sep 17 00:00:00 2001 From: theAstrogoth Date: Sun, 12 Apr 2026 21:50:26 -0500 Subject: [PATCH 04/10] finish up a few missed things --- .../Source/Pokemon/Pokemon_AdvRng.cpp | 27 ++++++++++++------- .../Source/Pokemon/Pokemon_AdvRng.h | 24 ++++++++--------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp index 44c5168b7e..2a7c46a1b7 100644 --- a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp +++ b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp @@ -1,4 +1,4 @@ -/* Xoroshiro128+ and reverse +/* Adv RNG * * From: https://github.com/PokemonAutomation/ * @@ -14,23 +14,24 @@ uint32_t increment_internal_rng_state(uint32_t& state){ return state * 0x41c64e6d + 0x6073; } -AdvRngState rngstate_from_internal_state(uint16_t seed, uint64_t advances, uint32_t& state){ +AdvRngState rngstate_from_internal_state(uint16_t seed, uint64_t advances, uint32_t& state, RngMethod method){ uint32_t s0 = state; uint32_t s1 = increment_internal_rng_state(s0); uint32_t s2 = increment_internal_rng_state(s1); uint32_t s3 = increment_internal_rng_state(s2); uint32_t s4 = increment_internal_rng_state(s3); - return AdvRngState(seed, advances, s0, s1, s2, s3, s4); + return AdvRngState(seed, advances, method, s0, s1, s2, s3, s4); } -AdvRngState rngstate_from_seed(uint16_t& seed, uint64_t& advances){ +AdvRngState rngstate_from_seed(uint16_t& seed, uint64_t advances, RngMethod method){ uint32_t state = seed; - for (int i=0; i& hits, AdvRngFilters& target, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid, uint8_t gender_threshold ){ +void AdvRng::search_advance_range(std::map& hits, AdvRngFilters& target, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid, uint8_t gender_threshold){ for (int m=0; m<3; m++){ set_state_advances(min_advances); @@ -196,6 +202,7 @@ void AdvRng::search_advance_range(std::map& hits, std::map AdvRng::search(AdvRngFilters& target, std::vector& seeds, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid, uint8_t gender_threshold){ std::map hits; for (uint16_t seed : seeds){ + set_seed(seed); search_advance_range(hits, target, min_advances, max_advances, tid_xor_sid, gender_threshold); } return hits; diff --git a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h index 9b3039d382..8e59b67599 100644 --- a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h +++ b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h @@ -1,11 +1,11 @@ -/* Advance RNG +/* Adv RNG * * From: https://github.com/PokemonAutomation/ * */ -#ifndef PokemonAutomation_PokemonSwSh_AdvRng_H -#define PokemonAutomation_PokemonSwSh_AdvRng_H +#ifndef Pokemon_AdvRng_H +#define Pokemon_AdvRng_H #include #include @@ -78,11 +78,18 @@ enum class ShinyType{ Any }; +enum class RngMethod{ + Method1, + Method2, + Method4, + Any +}; struct AdvRngState{ - AdvRngState(uint16_t seed, uint64_t advance, uint32_t s0, uint32_t s1, uint32_t s2, uint32_t s3, uint32_t s4); + AdvRngState(uint16_t seed, uint64_t advance, RngMethod method, uint32_t s0, uint32_t s1, uint32_t s2, uint32_t s3, uint32_t s4); uint16_t seed; uint64_t advance; + RngMethod method; uint32_t s0; uint32_t s1; uint32_t s2; @@ -90,13 +97,6 @@ struct AdvRngState{ uint32_t s4; }; -enum class RngMethod{ - Method1, - Method2, - Method4, - Any -}; - struct AdvPokemonResult{ AdvPokemonResult(uint32_t pid, uint16_t gender, Nature nature, Ability ability, IVs ivs); uint32_t pid; @@ -123,7 +123,7 @@ class AdvRng{ std::map search(AdvRngFilters& target, std::vector& seeds, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid = 0, uint8_t gender_threshold = 126); private: AdvRng(uint16_t seed, AdvRngState state); - AdvRng(uint16_t seed, uint64_t min_advances); + AdvRng(uint16_t seed, uint64_t min_advances, RngMethod method = RngMethod::Method1); void set_seed(uint16_t seed); void set_state_advances(uint64_t advances); From 2e316f672d7d50dd36aa269157c1b11a96ddee57 Mon Sep 17 00:00:00 2001 From: theAstrogoth Date: Sun, 12 Apr 2026 21:53:47 -0500 Subject: [PATCH 05/10] make constructors public --- SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h index 8e59b67599..690b2f182a 100644 --- a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h +++ b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h @@ -120,11 +120,11 @@ class AdvRng{ uint16_t seed; AdvRngState state; - std::map search(AdvRngFilters& target, std::vector& seeds, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid = 0, uint8_t gender_threshold = 126); -private: AdvRng(uint16_t seed, AdvRngState state); AdvRng(uint16_t seed, uint64_t min_advances, RngMethod method = RngMethod::Method1); + std::map search(AdvRngFilters& target, std::vector& seeds, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid = 0, uint8_t gender_threshold = 126); +private: void set_seed(uint16_t seed); void set_state_advances(uint64_t advances); void advance_state(); From 68c25b45dae29c4057454a0038d7b39ebd851eee Mon Sep 17 00:00:00 2001 From: theAstrogoth Date: Sun, 12 Apr 2026 22:11:40 -0500 Subject: [PATCH 06/10] expose more public methods --- SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h index 690b2f182a..aeba61fb33 100644 --- a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h +++ b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h @@ -123,11 +123,12 @@ class AdvRng{ AdvRng(uint16_t seed, AdvRngState state); AdvRng(uint16_t seed, uint64_t min_advances, RngMethod method = RngMethod::Method1); - std::map search(AdvRngFilters& target, std::vector& seeds, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid = 0, uint8_t gender_threshold = 126); -private: void set_seed(uint16_t seed); void set_state_advances(uint64_t advances); void advance_state(); + + std::map search(AdvRngFilters& target, std::vector& seeds, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid = 0, uint8_t gender_threshold = 126); +private: void search_advance_range(std::map& hits, AdvRngFilters& target, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid, uint8_t gender_threshold); }; From 3178b8b8e3bcd3702869b7b67289e49a82ce4edc Mon Sep 17 00:00:00 2001 From: theAstrogoth Date: Sun, 12 Apr 2026 22:15:07 -0500 Subject: [PATCH 07/10] fix order of operations for shiny type --- SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp index 2a7c46a1b7..e1a3f56759 100644 --- a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp +++ b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp @@ -120,7 +120,7 @@ ShinyType shiny_type_from_pid(uint32_t pid, uint16_t tid_xor_sid){ if (pid_xor == tid_xor_sid){ return ShinyType::Square; - }else if (pid_xor ^ tid_xor_sid < 8){ + }else if ((pid_xor ^ tid_xor_sid) < 8){ return ShinyType::Star; }else{ return ShinyType::Normal; From b52e9ba2a2a7d83ae0b3edcced4df0666573a751 Mon Sep 17 00:00:00 2001 From: theAstrogoth Date: Sun, 12 Apr 2026 22:17:15 -0500 Subject: [PATCH 08/10] fix int comparisons --- SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp index e1a3f56759..0317c65f64 100644 --- a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp +++ b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp @@ -27,7 +27,7 @@ AdvRngState rngstate_from_internal_state(uint16_t seed, uint64_t advances, uint3 AdvRngState rngstate_from_seed(uint16_t& seed, uint64_t advances, RngMethod method){ uint32_t state = seed; state = increment_internal_rng_state(state); - for (int i=0; i& hits, AdvRngFilters& target, uint64_t min_advances, uint64_t max_advances, uint16_t tid_xor_sid, uint8_t gender_threshold){ - for (int m=0; m<3; m++){ + for (uint8_t m=0; m<3; m++){ set_state_advances(min_advances); RngMethod method; @@ -189,7 +189,7 @@ void AdvRng::search_advance_range(std::map& hits, continue; } - for (int a=min_advances; a Date: Sun, 12 Apr 2026 22:47:21 -0500 Subject: [PATCH 09/10] more fixes --- .../Source/Pokemon/Pokemon_AdvRng.cpp | 17 ++++++++--------- SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h | 7 +++++-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp index 0317c65f64..2a8971ea40 100644 --- a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp +++ b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.cpp @@ -21,7 +21,7 @@ AdvRngState rngstate_from_internal_state(uint16_t seed, uint64_t advances, uint3 uint32_t s3 = increment_internal_rng_state(s2); uint32_t s4 = increment_internal_rng_state(s3); - return AdvRngState(seed, advances, method, s0, s1, s2, s3, s4); + return {seed, advances, method, s0, s1, s2, s3, s4}; } AdvRngState rngstate_from_seed(uint16_t& seed, uint64_t advances, RngMethod method){ @@ -86,10 +86,7 @@ AdvPokemonResult pokemon_from_state(AdvRngState& state, RngMethod method = RngMe IvGroup ivgroup1; IvGroup ivgroup2; switch(method){ - case RngMethod::Method1: - ivgroup1 = iv_group_from_state(state.s2); - ivgroup2 = iv_group_from_state(state.s3); - break; + case RngMethod::Method2: ivgroup1 = iv_group_from_state(state.s3); ivgroup2 = iv_group_from_state(state.s4); @@ -98,7 +95,10 @@ AdvPokemonResult pokemon_from_state(AdvRngState& state, RngMethod method = RngMe ivgroup1 = iv_group_from_state(state.s2); ivgroup2 = iv_group_from_state(state.s4); break; + case RngMethod::Method1: default: + ivgroup1 = iv_group_from_state(state.s2); + ivgroup2 = iv_group_from_state(state.s3); break; } @@ -110,7 +110,7 @@ AdvPokemonResult pokemon_from_state(AdvRngState& state, RngMethod method = RngMe ivs.spdef = ivgroup2.iv1; ivs.speed = ivgroup2.iv2; - return AdvPokemonResult(pid, gender, nature, ability, ivs); + return {pid, gender, nature, ability, ivs}; } ShinyType shiny_type_from_pid(uint32_t pid, uint16_t tid_xor_sid){ @@ -172,16 +172,15 @@ void AdvRng::search_advance_range(std::map& hits, RngMethod method; switch (m){ - case 0: - method = RngMethod::Method1; - break; case 1: method = RngMethod::Method2; break; case 2: method = RngMethod::Method4; break; + case 0: default: + method = RngMethod::Method1; break; } diff --git a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h index aeba61fb33..17e1434eb9 100644 --- a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h +++ b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h @@ -86,7 +86,6 @@ enum class RngMethod{ }; struct AdvRngState{ - AdvRngState(uint16_t seed, uint64_t advance, RngMethod method, uint32_t s0, uint32_t s1, uint32_t s2, uint32_t s3, uint32_t s4); uint16_t seed; uint64_t advance; RngMethod method; @@ -95,10 +94,14 @@ struct AdvRngState{ uint32_t s2; uint32_t s3; uint32_t s4; + + bool operator<(const AdvRngState& rhs) const noexcept + { + return this->advance < rhs.advance; + } }; struct AdvPokemonResult{ - AdvPokemonResult(uint32_t pid, uint16_t gender, Nature nature, Ability ability, IVs ivs); uint32_t pid; uint8_t gender; Nature nature; From 854447ba6a3de552a44b55b5bef6e23b7c36dbc8 Mon Sep 17 00:00:00 2001 From: theAstrogoth Date: Sun, 12 Apr 2026 23:23:04 -0500 Subject: [PATCH 10/10] small style fix --- SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h index 17e1434eb9..7b86c159f7 100644 --- a/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h +++ b/SerialPrograms/Source/Pokemon/Pokemon_AdvRng.h @@ -95,8 +95,7 @@ struct AdvRngState{ uint32_t s3; uint32_t s4; - bool operator<(const AdvRngState& rhs) const noexcept - { + bool operator<(const AdvRngState& rhs) const noexcept{ return this->advance < rhs.advance; } };