Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- B2W2 (U) RNG Script v0.03 --
- -- written by ProjectRevoTPP --
- -- designed for DesMUmE v0.9.9 --
- module("mt19937", package.seeall)
- 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
- RNG_ADDR = 0x021FFC58
- IVRNG_ADDR = 0x21FED68
- desired_seed = "0xDEADBEEFDEADBEEF"
- -- main program below --
- 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
- -- 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)
- for N = 1, 624 do
- memory.writedword(IVRNG_ADDR + (4 * (N - 1)), mt[N])
- print(string.format("Wrote %i", N))
- N = N + 1
- end
- 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()
- 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("First RNG seed: %08x%08x", rng2, rng1))
- memory.writedword(RNG_ADDR, desired_seed_1)
- memory.writedword(RNG_ADDR + 4, desired_seed_2)
- 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("IVRNG 1: %08x", mtrng))
- writemersennetable(desired_seed_1)
- mtrng = memory.readdword(IVRNG_ADDR)
- print(string.format("IVRNG 1 After updating: %08x", mtrng))
- print(string.format("RNG seed injected to: %08x%08x", desired_seed_1, desired_seed_2))
- 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
- print(string.format("New RNG seed: %08x%08x", rng2, rng1))
- last_known_rng_value_1 = rng1;
- last_known_rng_value_2 = rng2;
- end
- end
- emu.frameadvance()
- until false
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement