mvbg

VM_RANDOMIZE

VM_RANDOMIZE is a GBVM instruction used to initialize the seed of the Game Boy’s pseudo-random number generator (PRNG) with a non-deterministic value, typically derived from system timing or other volatile sources.

Purpose: While VM_INIT_RNG allows for reproducible random sequences by setting a specific seed, VM_RANDOMIZE aims to provide a more genuinely “random” starting point for the PRNG. This is crucial for:

When VM_RANDOMIZE is called, the GBVM typically uses an internal source of entropy (like the current VBlank counter, CPU cycles, or other volatile hardware states) to generate a seed. This makes the initial state of the PRNG less predictable.

Syntax:

VM_RANDOMIZE

VM_RANDOMIZE takes no arguments. It simply performs the seeding operation internally.

Usage Example: Seeding RNG at Game Start

A common practice in games is to call VM_RANDOMIZE once at the very beginning of the game (e.g., on the title screen or when a new game is started) to ensure that all subsequent random operations are truly varied.

; In your game's main initialization script (e.g., on boot or new game start):

GAME_INITIALIZATION:
  ; ... other initialization routines (load assets, set up variables) ...

  ; Initialize the random number generator with a non-deterministic seed
  VM_RANDOMIZE

  ; Now, any subsequent calls to VM_RAND will produce varied sequences
  VM_CALL START_TITLE_SCREEN

; --- Example of a routine that uses random numbers (e.g., for enemy spawn) ---
SPAWN_ENEMY:
  ; Generate a random X coordinate for enemy spawn
  VM_RAND VAR_ENEMY_X, 16, 144 ; Random X between 16 and 159

  ; Generate a random enemy type
  VM_RAND VAR_ENEMY_TYPE, 0, 3 ; Random type (0, 1, 2, or 3)

  ; ... spawn enemy based on VAR_ENEMY_X and VAR_ENEMY_TYPE ...

  VM_RET

In this example, VM_RANDOMIZE is called once at GAME_INITIALIZATION. This ensures that every time the game is started, the SPAWN_ENEMY routine (and any other routines using VM_RAND) will produce a different sequence of random numbers, leading to varied gameplay experiences.

Analogy to other programming languages: This is analogous to calling srand(time(NULL)) in C/C++ or simply random.seed() without arguments in Python (which typically uses the current system time). It’s the standard way to ensure that your random number generator produces different sequences each time the program is run, making the game feel less predictable.