Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- B2W2 (U) RNG Script v1.0 --
- -- written by ProjectRevoTPP --
- -- based on MKDasher's scripts --
- -- designed for DesMUmE v0.9.9+ --
- -- DO NOT USE 32-BIT DESMUME WITH THIS SCRIPT, IT WONT WORK!--
- module("mt19937", package.seeall)
- -- CONFIG --
- desired_seed = "0x8D133658030FC2E7"
- display_config = 1 -- 0 for lua window, 1 for gui text, anything else to not print
- game = 0 -- 0 for white2, 1 for black2
- RNG_ADDR = 0x021FFC58-0x20*game
- IVRNG_ADDR = 0x21FED68-0x20*game
- ------------------------------------------
- -- main program below --
- local UPPER_MASK = 0x80000000 -- most significant w-r bits
- local LOWER_MASK = 0x7fffffff -- least significant r bits
- local mt = {} -- the array for the state vector
- local NUM = 624
- local M = 397
- desired_seed_1 = string.sub(desired_seed, 0, 10) -- upper
- desired_seed_2 = "0x" .. string.sub(desired_seed, 11, 18) -- lower
- function FramesAdvance(nframes)
- for frame = 1, nframes do
- emu.frameadvance()
- end
- end
- function drawguitext(rng2, rng1)
- gui.text(1,10,string.format("Current: %08X%08X",rng2,rng1))
- end
- -- initializes mt[N] with a seed
- function randomseed(s)
- s = bit.band(s, 0xffffffff)
- mt[1] = s
- for i = 1, NUM - 1 do
- -- s = 1812433253 * (bit.bxor(s, bit.rshift(s, 30))) + i
- s = bit.bxor(s, bit.rshift(s, 30))
- local s_lo = bit.band(s, 0xffff)
- local s_hi = bit.rshift(s, 16)
- local s_lo2 = bit.band(1812433253 * s_lo, 0xffffffff)
- local s_hi2 = bit.band(1812433253 * s_hi, 0xffff)
- s = bit.bor(bit.lshift(bit.rshift(s_lo2, 16) + s_hi2, 16),
- bit.band(s_lo2, 0xffff))
- -- s = bit.band(s + i, 0xffffffff)
- local s_lim = -bit.tobit(s)
- -- assumes i<2^31
- if (s_lim > 0 and s_lim <= i) then
- s = i - s_lim
- else
- s = s + i
- end
- mt[i+1] = s
- -- See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier.
- -- In the previous versions, MSBs of the seed affect
- -- only MSBs of the array mt[].
- -- 2002/01/09 modified by Makoto Matsumoto
- end
- mti = NUM
- end
- local mag01 = { 0, MATRIX_A } -- mag01[x] = x * MATRIX_A for x=0,1
- function writemersennetable(seed)
- local N
- randomseed(seed)
- print("Writing mersenne table...")
- for N = 1, 624 do
- memory.writedword(IVRNG_ADDR + (4 * (N - 1)), mt[N])
- N = N + 1
- end
- print("Write complete.")
- end
- last_known_rng_value_1 = 0; -- set initial local rng to 0
- last_known_rng_value_2 = 0; -- set initial local rng to 0
- emu.reset() -- reset the game.
- FramesAdvance(30) -- wait for the first seed update before forcing
- local rng1 = memory.readdword(RNG_ADDR)
- local rng2 = memory.readdword(RNG_ADDR + 4)
- print(string.format("Initial RNG seed: %08x%08x", rng2, rng1))
- -- WARNING: does not support 32-bit! --
- -- write the forced seed and backup. --
- memory.writedword(RNG_ADDR, desired_seed_2)
- memory.writedword(RNG_ADDR + 4, desired_seed_1)
- last_known_rng_value_1 = desired_seed_1
- last_known_rng_value_2 = desired_seed_2
- local mtrng = memory.readdword(IVRNG_ADDR)
- print(string.format("Initial IVRNG: %08x", mtrng))
- print("RNG seed to be injected is: ", desired_seed)
- -- force mersenne table. --
- writemersennetable(desired_seed_1)
- mtrng = memory.readdword(IVRNG_ADDR)
- print(string.format("IVRNG After updating: %08x", mtrng))
- print(string.format("RNG seed injected: %08x%08x", desired_seed_1, desired_seed_2))
- -- do main loop. --
- repeat
- local rng1 = memory.readdword(RNG_ADDR)
- local rng2 = memory.readdword(RNG_ADDR + 4)
- if rng1 ~= last_known_rng_value_1 then
- if rng2 ~= last_known_rng_value_2 then
- if display_config == 0 then
- print(string.format("Current: %08x%08x", rng2, rng1))
- end
- last_known_rng_value_1 = rng1
- last_known_rng_value_2 = rng2
- end
- end
- if display_config == 1 then
- drawguitext(rng2, rng1)
- end
- emu.frameadvance()
- until false
- gui.register(drawguitext)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement