RNG: Difference between revisions
(→Description: finish adding data) |
|||
Line 30: | Line 30: | ||
* Although not an object, [[snow]] also calls RNG. | * Although not an object, [[snow]] also calls RNG. | ||
* [[Coin]]s from Bob-ombs, Goombas, [[Big Cork Box]]es, [[Cork Box]]es, [[Piranha Plant]]s, [[Bully|Bullies]], [[Chuckya]]s, [[Fly Guy]]s, [[Snowman|Snowmen]], etc... you name it, it calls RNG to determine angle, horizontal speed, and [[vertical speed]]. | * [[Coin]]s from Bob-ombs, Goombas, [[Big Cork Box]]es, [[Cork Box]]es, [[Piranha Plant]]s, [[Bully|Bullies]], [[Chuckya]]s, [[Fly Guy]]s, [[Snowman|Snowmen]], etc... you name it, it calls RNG to determine angle, horizontal speed, and [[vertical speed]]. | ||
* [[Bowser]] calls RNG to determine which attack to do next. | |||
* And many, many, many, many, many more. |
Revision as of 23:52, 10 October 2018
RNG or Random Number Generation is the game's method of generating a random short. By doing this, the game can make things like dust movement seem random.
Technical description
The RNG variable is a short, which is a number from 0 to 65535 inclusive. When an object, snow, or something else wants to call RNG, it takes the current RNG value and runs it through the RNG function, below. It uses the result in its own calculations and also stores the result to the RNG variable. Thus, the RNG variable is equal to the last used RNG value.
The RNG function
unsigned short rng_function (unsigned short input) { if (input == 0x560A) input = 0; unsigned short S0 = (unsigned char)input << 8; S0 = S0 ^ input; input = ((S0 & 0xFF) << 8) | ((S0 & 0xFF00) >> 8); S0 = ((unsigned char)S0 << 1) ^ input; short S1 = (S0 >> 1) ^ 0xFF80; if ((S0 & 1) == 0) { if (S1 == 0xAA55) input = 0; else input = S1 ^ 0x1FF4; } else input = S1 ^ 0x8180; return (unsigned short)input; }
Description
The function has 65536 possible inputs and 65536 possible outputs. It is a bijection, meaning that every input maps to exactly one output and none repeat or are left out. The function forms two loops, one of length 65534 and one of length 2, but one of the if statements causes the cycle of 2 to lead back to the cycle of 65534. Oddly, the RNG value of 21674 at index 65113 loops back to index 0. This may be because this index's S1 value is equal to the previous RNG value for the first time, but that is no reason to prematurely end the loop. Indeces 65114-65533, as well as values 22026 and 58704 (the loop of 2, which are not given indeces) are considered impossible RNG values and cannot be reached without hacking. The RNG index and value of 0 is set when the game powers on.
Objects that call RNG
- Dust calls RNG to determine its resultant angle and horizontal speed. Note that the dust itself calls RNG, not the dust spawner.
- Goombas call RNG to determine which direction to move when they do not see Mario.
- Bob-ombs call RNG almost every frame to determine whether to blink.
- Although not an object, snow also calls RNG.
- Coins from Bob-ombs, Goombas, Big Cork Boxes, Cork Boxes, Piranha Plants, Bullies, Chuckyas, Fly Guys, Snowmen, etc... you name it, it calls RNG to determine angle, horizontal speed, and vertical speed.
- Bowser calls RNG to determine which attack to do next.
- And many, many, many, many, many more.