Difference between revisions of "SOTN/RNG"

From Castlevania Speedrunning
Jump to: navigation, search
m (SestrenExsis moved page SOTN/Nice RNG to SOTN/RNG: No need to split RNG up into two pages)
(Document the Nice and Evil RNG)
Line 1: Line 1:
Symphony of the Night uses Pseudo-Random Number Generators when randomness is needed in the game. There are two PRNGs that are currently known about (dubbed Nice and Evil), and each is responsible for handling the randomness of different events in the game.
+
Symphony of the Night uses [https://en.wikipedia.org/wiki/Pseudorandom_number_generator| Pseudo-Random Number Generators] when randomness is needed in the game. There are two PRNGs that are currently known about (dubbed Nice and Evil), and each is responsible for handling the randomness of different events in the game.
  
Both PRNGs operate in a similar fashion, but have different numbers used when determining the next seed value. The Nice RNG is responsible for, among other things, determining the location of Dracula's teleports in the Prologue, determining [[SOTN/Flea_Man|Flea Man]] jumps, and ...
+
Both RNGs are set to an initial value of 0 on startup. For the most part, the Evil RNG is advanced once every frame, even if the character isn't doing anything (hence why it has been dubbed Evil). Different functions within the games code will also make specific calls to the Nice and Evil RNG, and so different events will trigger one or the other. A comprehensive list of what events call which RNG is not known, but a few events have been figured out. The Nice RNG is responsible for determining the location of Dracula's teleports in the Prologue, determining [[SOTN/Flea_Man|Flea Man]] jumps, determining the rotations of the Books in the Library, etc. The Evil RNG is responsible for determining whether or not an item drop occurs after an enemy dies and whether or not an item drop will be rare, uncommon, or common. The Evil RNG is also responsible for determining which Food item will drop from a Meal Ticket.
  
TODO: Flesh out this page
+
Both RNGs operate in a similar manner, but use different numbers as their multiplier, increment, and shift, as detailed in the code sections at the bottom of the page.
 +
 
 +
<nowiki># Python implementation of the Nice RNG used in SOTN
 +
class NiceRng():
 +
    def __init__(self, initial_seed: int=0):
 +
        self.seed = initial_seed
 +
   
 +
    def current(self) -> int:
 +
        result = self.seed >> 0x18
 +
        return result
 +
   
 +
    def next(self) -> int:
 +
        self.seed = 0xFFFFFFFF & ((self.seed * 0x01010101) + 1)
 +
        result = self.current()
 +
        return result</nowiki>
 +
 
 +
<nowiki># Python implementation of the evil RNG used in SOTN
 +
class EvilRng():
 +
    def __init__(self, initial_seed: int=0):
 +
        self.seed = initial_seed
 +
   
 +
    def current(self) -> int:
 +
        result = self.seed >> 0x11
 +
        return result
 +
   
 +
    def next(self) -> int:
 +
        self.seed = 0xFFFFFFFF & ((self.seed * 0x41c64e6d) + 0x3039)
 +
        result = self.current()
 +
        return result</nowiki>

Revision as of 12:24, 19 June 2023

Symphony of the Night uses Pseudo-Random Number Generators when randomness is needed in the game. There are two PRNGs that are currently known about (dubbed Nice and Evil), and each is responsible for handling the randomness of different events in the game.

Both RNGs are set to an initial value of 0 on startup. For the most part, the Evil RNG is advanced once every frame, even if the character isn't doing anything (hence why it has been dubbed Evil). Different functions within the games code will also make specific calls to the Nice and Evil RNG, and so different events will trigger one or the other. A comprehensive list of what events call which RNG is not known, but a few events have been figured out. The Nice RNG is responsible for determining the location of Dracula's teleports in the Prologue, determining Flea Man jumps, determining the rotations of the Books in the Library, etc. The Evil RNG is responsible for determining whether or not an item drop occurs after an enemy dies and whether or not an item drop will be rare, uncommon, or common. The Evil RNG is also responsible for determining which Food item will drop from a Meal Ticket.

Both RNGs operate in a similar manner, but use different numbers as their multiplier, increment, and shift, as detailed in the code sections at the bottom of the page.

# Python implementation of the Nice RNG used in SOTN
class NiceRng():
    def __init__(self, initial_seed: int=0):
        self.seed = initial_seed
    
    def current(self) -> int:
        result = self.seed >> 0x18
        return result
    
    def next(self) -> int:
        self.seed = 0xFFFFFFFF & ((self.seed * 0x01010101) + 1)
        result = self.current()
        return result
# Python implementation of the evil RNG used in SOTN
class EvilRng():
    def __init__(self, initial_seed: int=0):
        self.seed = initial_seed
    
    def current(self) -> int:
        result = self.seed >> 0x11
        return result
    
    def next(self) -> int:
        self.seed = 0xFFFFFFFF & ((self.seed * 0x41c64e6d) + 0x3039)
        result = self.current()
        return result