Back to Page
Revision 27 (current)
Edited by adelikat on 4/13/2024 4:53 PM
This page deals with the RNG mechanics of Pokemon Ruby/Sapphire/Emerald.
[TODO]
! Cycling method
The RNG cycling method is determined by the following formula:
value <- value*[[0x41C64E6D]] + [[0x6073]]
where 'value' is an unsigned 32-bit number.
This cycling method is known as a [http://en.wikipedia.org/wiki/Linear_congruential_generator|linear congruential generator], and covers all 32-bit values. For randomization purposes, the game will only ever consider the top half of the value when deciding random actions.
! Cycling habits
The game tends to cycle the RNG once per frame outside of battle or in menus, and twice per frame in battle outside of menus (when the battlefield is visible).
If the game cycles more than that on a given frame, it is trying to determine a random action.
!!! Initialization
! Initial seed
For Ruby/Sapphire, [Forum/Posts/262235|this post] details how the game sets the initial seed based on the 'uid' (Unix time) of the movie file. If no movie file is running, it uses system clock instead. In particular, this method generates any initial seed of the form 0x0000????, where the ???? is any 4-digit hexadecimal number. In VBA, the initial seed is planted on frame 6.
Note: If the GBA clock (real-time clock) does not work, the game assumes it is always 2000 Jan. 1, 00:00:00 without changing, and the initial seed is 0x000005A0.
For Emerald, the initial seed is always 0x00000000 and is planted on frame 1. However, if you start a new game, there is a second initial seed that occurs after naming your character. It doubles as the visible trainer ID.
! Trainer ID number (Ruby/Sapphire).
The trainer ID number is determined near the beginning of the game. It is set after the Pokemon professor dismisses you into the world (your character sprite shrinks and fades into the black background), but before you appear in the moving truck.
The trainer ID number is a 32-bit value. The top half is the secret ID and the bottom half is the visible ID, which the game displays on the character status screen as your trainer ID.
When the game sets your ID number, it cycles the RNG 3 times on that frame.
xxxxxxxx
aaaaxxxx secret ID: aaaa
bbbbxxxx visible ID: bbbb
The trainer ID number is at memory address 0x2024EAE.
! Trainer ID number (Emerald)
The trainer ID is determined in two separate parts: the visible ID and the secret ID.
The visible ID is determined after you leave the naming screen for your character. The game creates an initial seed with the same value at that point as well. It does so by taking the bottom half of the value at address 0x4000104 at the time.
Address 0x4000104 is an entropy byte, which continually increases and is affected by execution at every step. It is unpredictable. It begins running when you enter the naming screen and stops when you leave, when the visible ID is determined.
The secret ID is determined shortly before the character sprite disappears into the black background, after the professor dismisses you.
When the game sets your secret ID, it cycles the RNG 2 times on that frame.
xxxxxxxx
aaaaxxxx secret ID: aaaa
!!! Stat generation
! Some set Pokemon
For some set Pokemon (not wild), the game will decide its stats by cycling the RNG 5 times on that frame. This applies to the following Pokemon:
* The starter, when it is selected.
* The legendary, when it does its cry.
* Wally's Zigzagoon for the tutorial battle, as soon as you leave the gym.
xxxxxxxx
aaaaxxxx
bbbbxxxx PID: bbbbaaaa
ccccxxxx cccc -> (bin) xrrrrrqq_qqqppppp
HP IV: ppppp, Atk IV: qqqqq, Def IV: rrrrr
ddddxxxx dddd -> (bin) xuuuuutt_tttsssss
Spe IV: sssss, SpAtk IV: ttttt, SpDef IV: uuuuu
! First tutorial wild Pokemon (Poochyena in Ruby/Sapphire)
For the wild Pokemon in the tutorial, the game decides its PID by cycling the RNG 7 times on that frame, and IVs by cycling 4 times on the next frame
xxxxxxxx
????xxxx
????xxxx
????xxxx
????xxxx
aaaaxxxx
bbbbxxxx PID: bbbbaaaa
next frame:
xxxxxxxx
xxxxxxxx
ccccxxxx cccc -> (bin) xrrrrrqq_qqqppppp
HP IV: ppppp, Atk IV: qqqqq, Def IV: rrrrr
ddddxxxx dddd -> (bin) xuuuuutt_tttsssss
Spe IV: sssss, SpAtk IV: ttttt, SpDef IV: uuuuu
! Ralts (tutorial battle)
When the game generates Ralts, it cycles the RNG at least 7 times, depending on the RNG values:
xxxxxxxx
Tentative trainer ID and PID
aaaaxxxx
bbbbxxxx tentative trainer ID: bbbbaaaa
ccecxxxx
ddddxxxx tentative PID: ddddccec
if e>7, set tentative trainer ID and PID as trainer ID and PID, do IVs
otherwise, repeat tentative trainer ID and PID
(Note: The game is ensuring that the generated Ralts is male.)
IVs:
ffffxxxx ffff -> (bin) xrrrrrqq_qqqppppp
HP IV: ppppp, Atk IV: qqqqq, Def IV: rrrrr
ggggxxxx gggg -> (bin) xuuuuutt_tttsssss
Spe IV: sssss, SpAtk IV: ttttt, SpDef IV: uuuuu
The generated trainer ID has no bearing on any other trainer ID in the game.
! Wild Encounter (Ruby/Sapphire)
The game determines whether a wild encounter occurs when you have completely entered the grass tile, or finished turning in a grass tile.
When the game checks for a random encounter, the game will cycle the RNG 2 times (3 times if first entering grass). If a random encounter occurs, the game will cycle the RNG some number of times, depending on the random values.
Entering grass:
xxxxxxxx
????xxxx
aaaaxxxx encounter: aaaa mod 2880 < 320 otherwise stop
Already in grass:
xxxxxxxx
aaaaxxxx encounter: aaaa mod 2880 < 320 otherwise stop
Encounter:
bbbbxxxx species and level of pokemon: bbbb mod 100
????xxxx
ccccxxxx nature: cccc mod 25 do tentative PID
Tentative PID:
ddddxxxx
eeeexxxx tentative PID: eeeedddd
if eeeedddd mod 25 == nature, set PID as tentative PID and do IVs
otherwise repeat tentative PID
IVs:
ffffxxxx ffff -> (bin) xrrrrrqq_qqqppppp
HP IV: ppppp, Atk IV: qqqqq, Def IV: rrrrr
ggggxxxx gggg -> (bin) xuuuuutt_tttsssss
Spe IV: sssss, SpAtk IV: ttttt, SpDef IV: uuuuu
All numbers for a particular species and level are together. This is not true in general for numbers for a particular species, or numbers for a particular level. The species and level depend on the area where the random encounter occurs.
! Wild encounter hold item (Ruby/Sapphire)
Whether a hold item is rewarded or not is determined separately from the rest of the wild encounter generation. It is determined right at the boundary between outside of battle, and battle (the end of fadeout).
On the frame that determines the occurrence of a hold item, the game cycles the RNG 6 times. This occurs even if the Pokemon is incapable of obtaining a held item.
xxxxxxxx
????xxxx
????xxxx
????xxxx
????xxxx
aaaaxxxx 5% hold item occurrence: aaaa mod 100 >=95
!!! Battle
! In battle: Quick Claw activation
The game determines whether Quick Claw worked right before the battle menu appears with "Fight", etc. It stores a random value (top half) in address 0x2024D1C (Ruby/Sapphire). The game will only read this value when a move is selected for that turn.
When the game rolls to store the value in that address and so determine Quick Claw, the game will cycle the RNG 3 times on that frame.
xxxxxxxx
xxxxxxxx
aaaaxxxx Quick Claw activate: aaaa < 0x3333
Statistically, this gives about 1/5 chance for Quick Claw to work.
The game will cycle the RNG to store this value regardless of whether anyone has Quick Claw. Any other uses for this value are unknown.
! In battle: Accuracy
The game determines attack accuracy right before it says "X used attack", if the attack does damage. If the attack does not do damage, the game determines it after it says "X used attack".
When the game rolls for attack accuracy, the game will cycle the RNG 3 times on that frame.
xxxxxxxx
xxxxxxxx
aaaaxxxx Attack hit: aaaa mod 100 < acc% otherwise miss
! In battle: Critical hits
The game determines critical hits a few frames after the message "X used attack", provided that the attack does damage, and the attack did not miss, and it is not a tutorial battle where the game forbids critical hits.
When the game rolls for critical hits, the game will cycle the RNG 3 times on that frame.
xxxxxxxx
xxxxxxxx
xxxaxxxx Critical hit: a==0
This assumes a 1/16 chance of a critical hit. It does not describe situations where the critical hit ratio is raised to be greater than 1/16, or the target has the ability Battle Armor (no critical hits).
! In battle: Damage variation
For almost all attacks, the amount of damage that an attack does varies between about 85% and 100%. The game determines damage variation three frames after it checks for critical hit.
When the game rolls for damage variation, the game will cycle the RNG 3 times on that frame.
xxxxxxxx
xxxxxxxx
xxxaxxxx Damage variation, max: a==0 min: a==15
The lower the number, the more damage the attack does.
It is not known for certain if 0000 is the only value that does max damage (a property in the first two generations where only the "best" value yields max damage).
! In battle: Pickup ability
When possible, the game determines item pickup, if any, from Pickup ability at the end of battle, a few frames before the fadeout. It is required to have a Pokemon that has the Pickup ability that is holding nothing.
When the game rolls for item pickup, the game will cycle the RNG 3 or 4 times on that frame.
xxxxxxxx
xxxxxxxx
aaaaxxxx Get item: aaaa mod 10 == 0 otherwise stop
bbbbxxxx Item reward: bbbb mod 100
Ruby/Sapphire:
(Note: From [http://bulbapedia.bulbagarden.net/wiki/Pickup|extrapolation of information], trial, and guesswork. Not 100% verified).
||Value||Item||
|0-29|Super Potion|
|30-39|Full Heal|
|40-49|Ultra Ball|
|50-59|Rare Candy|
|60-69|Full Restore|
|70-79|Revive|
|80-89|Nugget|
|90-94|Protein|
|95-98|PP Up|
|99|King's Rock|
! In battle: Catching a Pokemon
When throwing a ball to catch a Pokemon, the game determines not only whether or not the Pokemon will be caught, but how many times the Pokeball will shake. It is determined right after "X used Y ball!"
The game uses a check value, and requires that random values pass the check four times. For more information, see [http://bulbapedia.bulbagarden.net/wiki/Catch_rate].
When the game rolls for catching a Pokemon, the game will cycle the RNG 3 to 6 times on that frame.
xxxxxxxx
xxxxxxxx
aaaaxxxx Shake 1: aaaa < checkvalue otherwise stop
bbbbxxxx Shake 2: bbbb < checkvalue otherwise stop
ccccxxxx Shake 3: cccc < checkvalue otherwise stop
ddddxxxx Catch: dddd < checkvalue
! In battle: Metronome (Emerald)
To determine the move used by Metronome, the game cycles the RNG at least 3 times. It is unknown why the game cycles more than necessary.
xxxxxxxx
xxxxxxxx
move:
xaaaxxxx aaa -> (bin) xxxb_bbbbbbbb
Metronome move: bbbbbbbbb + 1
if >354 or some forbidden move, do move again
See [http://bulbapedia.bulbagarden.net/wiki/List_of_moves].
----
See also: [http://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9mon_data_structure_in_Generation_III|Bulbapedia] for more information on game mechanics.